Oberon space
General Category => Общий раздел => Тема начата: ilovb от Ноябрь 13, 2012, 03:55:20 pm
-
http://en.wikipedia.org/wiki/Functional_programming#First-class_and_higher-order_functions
Programming languages that support function pointers as function parameters can emulate higher-order functions. Such languages include the C and C++ family. An example is the following C code which computes an approximation of the integral of an arbitrary function:
// Compute the integral of f() within the interval [a,b]
double integral(double (*f)(double x), double a, double b)
{
double sum, dt;
int i;
// Numerical integration: 0th order approximation
sum = 0.0;
dt = (b - a) / 100.0;
for (i = 0; i < 100; i++)
sum += (*f)(i * dt + a) * dt;
return sum;
}
Получается в Oberon'ах есть эти самые функции высшего порядка. И даже лучше чем в Си, т.к. имеют тип.
зы На сколько однако качественнее ангельская википедия (касаемо IT)
-
http://en.wikipedia.org/wiki/Functional_programming#First-class_and_higher-order_functions
Programming languages that support function pointers as function parameters can emulate higher-order functions. Such languages include the C and C++ family. An example is the following C code which computes an approximation of the integral of an arbitrary function:
// Compute the integral of f() within the interval [a,b]
double integral(double (*f)(double x), double a, double b)
{
...
}
Получается в Oberon'ах есть эти самые функции высшего порядка. И даже лучше чем в Си, т.к. имеют тип.
зы На сколько однако качественнее ангельская википедия (касаемо IT)
А в сях (и особенно C++) они что, тип не имеют? ;-) Как ты думаешь, что вот это такое из приведенного тобой кода: "double (*f)(double x)" ? ;-)
-
Ну и надергаю сюда своих ответов по HOF (и почему то, что есть в Обероне и Си HOF'ом назвать нельзя):
http://oberspace.dyndns.org/index.php/topic,366.msg10118.html#msg10118
ps Я вот если чесна вообще не очень понимаю чем отличается фвп от процедурного типа в паскале...
А отличие очень простое - функция высшего порядка это функция которая принимает на вход одну или несколько функций и на выход гонит тоже функцию. Так вот, чтобы это имело смысл, очень желательно иметь для функций не только одну лишь операцию присваивания. Должна быть возможность вернуть новую функцию, которой еще не было в программе. Для этого можно использовать каррирование, замыкания, комбинаторы и так далее.
http://oberspace.dyndns.org/index.php/topic,366.msg10123.html#msg10123
ok, давай на примерах. Представим себе, что в неком языке "Оo" есть целые числа. Есть как целочисленные литералы, так и целочисленные переменные. Целочисленной переменной можно присваивать целочисленные литералы, также можно присваивать значение одной переменной другой переменной. Все, больше ни одной операции для целых чисел в языке Oo нет (операций сложения, вычитания, умножения и так далее).
Внимание вопрос - можно ли считать, что данный язык полноценно поддерживает концепцию целых чисел?
-
Да я ж не шарю в сях. Ни строчки не писал ;D
Ну пусть так.
Вопрос в другом: Это оно? Т.е. тупо указатель на функцию под глянцевым названием?
-
Да я ж не шарю в сях. Ни строчки не писал ;D
Ну пусть так.
Вопрос в другом: Это оно? Т.е. тупо указатель на функцию под глянцевым названием?
Таки нет. Я выше процитировал свои сообщения. Там вроде бы объясняется. Даже на примерах.
Просто указатель на функцию (даже типобезопасный) - это на уровне поддержки целых чисел без возможности их складывать, сравнивать, умножать и так далее.
-
Ну и надергаю сюда своих ответов по HOF (и почему то, что есть в Обероне и Си HOF'ом назвать нельзя):
OK. В WIKI пиндосским по белому начертано:
In mathematics and computer science, a higher-order function (also functional form, functional or functor) is a function that does at least one of the following:
* take one or more functions as an input
* output a function
Других определений я не встречал. :)
-
Ну и надергаю сюда своих ответов по HOF (и почему то, что есть в Обероне и Си HOF'ом назвать нельзя):
OK. В WIKI пиндосским по белому начертано:
In mathematics and computer science, a higher-order function (also functional form, functional or functor) is a function that does at least one of the following:
* take one or more functions as an input
* output a function
Других определений я не встречал. :)
Ну да. Но мы же о реальном использовании говорим а не о формальных признаках? Кому нужны такие HOF, которые не могут вернуть ничего интересного?
-
А чего такого интересного они могут вернуть, чего нельзя на том же Си?
-
А чего такого интересного они могут вернуть, чего нельзя сделать на том же Си?
Например вернуть новую функцию :-) Которой до того не было.
-
Что значит не было? Можно пример?
-
Что значит не было? Можно пример?
А ты уверен что хочешь это видеть? :-)
Вот простейший пример (замечу, что C++ не лучший язык для демонстрации):
#include <algorithm>
#include <iostream>
using namespace std;
function<int()> get_f() {
auto t = random();
return [=](){return t;};
}
int main() {
auto f1 = get_f();
auto f2 = get_f();
cout << f1() <<"\t" << f2() << endl;
return 0;
}
Функция get_f возвращает функцию которая будет возвращать одно и то же случайное число (кокое именно - определяется при генерации оной функции).
-
Тык это ж замыкание вроде?! ???
-
Тык это ж замыкание вроде?! ???
Замыкание - это не фунция высшего порядка :-) Это захват переменных из области видимости (захват в том смысле что можно с собою унести, в Обероне нет замыканий, хотя локальные функции могут использовать локальные переменные).
Да, в данном случае новая функция генерируется именно через механизм замыканий.
Короче, для полноценного HOF не достаточно просто указателя на функцию, нужна более сложная структура.
-
Тык это ж замыкание вроде?! ???
Замыкание - это не фунция высшего порядка :-)
Ну и я ровно о том же.
Или ты хочешь сказать что HOF без замыканий не HOF?! (и хде такое утверждается у аццов ФП?)
По мне так наоборот замыкания без HOF не могут быть. :)
-
Тык это ж замыкание вроде?! ???
Замыкание - это не фунция высшего порядка :-)
Ну и я ровно о том же.
Или ты хочешь сказать что HOF без замыканий не HOF?! (и хде такое утверждается у аццов ФП?)
Я о том, что для полноценного HOF, нужно таки иметь возможность не только туда-сюда присваивать и вызывать, но еще и что-то не столь тривиальное делать. Например конструировать новые функции. Иначе это недоHOF в плане применимости ограничится sort'ом.
Это просто из личной практики применения всего этого.
-
Я все равно недопонимаю видимо. Почему конструировать?
Функция/замыкание просто хранит значения захваченных переменных. Функция то та же самая. В чистом ФП это наверно не совсем так, но мы и не о ФП говорим, а вообще.
-
Вот упрощенный аналог твоего кода на Lua:
function foo()
local n = 0
function closure()
n = n + 1
return n
end
return closure
end
f = foo()
print(f())
print(f())
print(f())
--Log:
--[[
1
2
3
--]]
closure какой была, такой и осталась...
-
Хотя нет. У тебя другая логика. Ну не суть.
-
Вот так у тебя:
function foo()
local n = math.random()
function closure()
return n
end
return closure
end
f = foo()
f1 = foo()
print(f())
print(f1())
print(f())
print(f1())
--Log:
--[[
0.0012512588885159
0.56358531449324
0.0012512588885159
0.56358531449324
--]]
-
Вот упрощенный аналог твоего кода на Lua:
...
closure какой была, такой и осталась...
Во-первых не надо путать как именно HOF реализуется/применяется с самой концепцией HOF.
Во-вторых я же явным образом писал, что с HOF в Луа все хорошо (точнее там настолько же хорошо как и в С++ и в js, но конечно хуже чем в haskell). А вот в Обероне и Си - плохо.
-
http://en.wikipedia.org/wiki/Functional_programming#First-class_and_higher-order_functions
Programming languages that support function pointers as function parameters can emulate higher-order functions. Such languages include the C and C++ family. An example is the following C code which computes an approximation of the integral of an arbitrary function:
can emulate
Эмуляция ФВП ещё не есть полноценная ФВП.
-
Глупо спорить о определениях. Предположим, что HOF есть в паскале (согласно какому-то там определению, без изменения собственно языка) - что от этого изменилось? Внезапно на паскале стало удобно писать и использовать стандартные библиотеки аля haskell?
Один из методов выхода из терминологического тупика - табуирование терминов. Табуируем термин HOF. Заменяем его на его смысл/свойства, и смотрим что получится.
Итак, эта штука, которую отныне нельзя называть, привносит в язык следующее:
enable partial application or currying, a technique in which a function is applied to its arguments one at a time, with each application returning a new function that accepts the next argument. This allows one to succinctly express, for example, the successor function as the addition operator partially applied to the natural number one.
Вопрос - в обероне-паскале это есть? Потому как если бы в них была бы эта штука, которую нельзя называть, в них было бы и частичное применение и карринг.
Ну и еще раз повторюсь - когда говорят есть вот эта штука в языке, или нет - подразумевают возможность безболезненно писать код на этом языке во вполне конкретном стиле. До С++11 в плюсах было весьма болезненно писать в функциональном стиле, а поскольку весть stl по сути своей является функциональщиной чистой воды, и является одновременно главной и стандартной либой плюсов, пользоваться плюсами было весьма болезненно. Сейчас же стало писать НАМНОГО приятней и проще. И код понятней. Именно потому, что теперь в плюсах теперь есть то, чего нельзя называть.
-
Functions in Lua are first-class values with proper lexical scoping.
What does it mean for functions to be "first-class values"? It means that, in Lua, a function is a value with the same rights as conventional values like numbers and strings. Functions can be stored in variables (both global and local) and in tables, can be passed as arguments, and can be returned by other functions.
What does it mean for functions to have "lexical scoping"? It means that functions can access variables of its enclosing functions. (It also means that Lua contains the lambda calculus properly.) As we will see in this chapter, this apparently innocuous property brings great power to the language, because it allows us to apply in Lua many powerful programming techniques from the functional-language world. Even if you have no interest at all in functional programming, it is worth learning a little about how to explore those techniques, because they can make your programs smaller and simpler.
В общем пока остаюсь при своем мнении. Везде повторяется одно и то же определение. И замыкания с фвп не смешиваются.
Все источники говорят о трех действиях:
1. Присвоить переменной
2. Принять аргументом
3. Вернуть
-
http://fprog.ru/2009/issue3/eugene-kirpichov-elements-of-functional-languages/
Функция называется функцией высшего порядка, если один из её аргументов — это функция, либо её возвращаемое значение — это функция.
И далее:
Замыкания жизненно важны для использования функций высшего порядка; без замыканий становится невозможно использовать сколько-нибудь полезную ФВП (как мы видели выше на примере map, написать полезную ФВП возможно, однако нетривиальные варианты ее использования оказываются недостижимыми).
Т.е. без замыканий мало пользы от ФВП, но первые не в коем разе не определяют последние.
-
Functions in Lua are first-class values with proper lexical scoping.
What does it mean for functions to be "first-class values"? It means that, in Lua, a function is a value with the same rights as conventional values like numbers and strings. Functions can be stored in variables (both global and local) and in tables, can be passed as arguments, and can be returned by other functions.
What does it mean for functions to have "lexical scoping"? It means that functions can access variables of its enclosing functions. (It also means that Lua contains the lambda calculus properly.) As we will see in this chapter, this apparently innocuous property brings great power to the language, because it allows us to apply in Lua many powerful programming techniques from the functional-language world. Even if you have no interest at all in functional programming, it is worth learning a little about how to explore those techniques, because they can make your programs smaller and simpler.
В общем пока остаюсь при своем мнении. Везде повторяется одно и то же определение. И замыкания с фвп не смешиваются.
Все источники говорят о трех действиях:
1. Присвоить переменной
2. Принять аргументом
3. Вернуть
Это определение - определение first-class functions а не HOF. Многие путают одно с другим, и Евгений Кирпичев не исключение (хотя ему как раз должно быть стыдно это путать).
-
Посмотри внимательно:
first-class values
-
Посмотри внимательно:
first-class values
Это не отменяет того факта, что там описывается именно first-class functions.
In computer science, a programming language is said to have first-class functions if it treats functions as first-class citizens. Specifically, this means the language supports passing functions as arguments to other functions, returning them as the values from other functions, and assigning them to variables or storing them in data structures.
Да, а если посмотришь еще внимательней, то увидишь что там нет ни слова про HOF :-)
-
Вот что я хотел этим сказать:
Определяющей характеристикой функциональных языков программирования является повышение функций до состояния первого класса. С функцией можно совершать те же действия, что и со значениями других встроенных типов, с сопоставимым объемом усилий.
Ниже представлены типичные вопросы для оценки состояния первого класса.
Можно ли привязать идентификатор к значению? Если да, можно ли присвоить ему имя?
Можно ли хранить значение в структуре данных, такой как список?
Можно ли передать значение в качестве аргумента в вызов функции?
Можно ли вернуть значение в качестве значения вызова функции?
Последние два вопроса оценки определяют то, что известно как операции высшего порядка или функции высшего порядка. Функции высшего порядка принимают функции в качестве аргументов и возвращают функции в качестве значения вызова функции. Эти операции поддерживают такие основы функционального программирования как функции сопоставления и объединение функций.
http://msdn.microsoft.com/ru-ru/library/dd233158.aspx
-
Вот что я хотел этим сказать:
Определяющей характеристикой функциональных языков программирования является повышение функций до состояния первого класса. С функцией можно совершать те же действия, что и со значениями других встроенных типов, с сопоставимым объемом усилий.
Ниже представлены типичные вопросы для оценки состояния первого класса.
Можно ли привязать идентификатор к значению? Если да, можно ли присвоить ему имя?
Можно ли хранить значение в структуре данных, такой как список?
Можно ли передать значение в качестве аргумента в вызов функции?
Можно ли вернуть значение в качестве значения вызова функции?
Последние два вопроса оценки определяют то, что известно как операции высшего порядка или функции высшего порядка. Функции высшего порядка принимают функции в качестве аргументов и возвращают функции в качестве значения вызова функции. Эти операции поддерживают такие основы функционального программирования как функции сопоставления и объединение функций.
http://msdn.microsoft.com/ru-ru/library/dd233158.aspx
До-о! Мелкософт конечно знатоки функциональщины! Особенно их пейсатели msdn'a :-)
Для начала, кто-нибудь видел язык, где можно было бы засунуть функцию в структуру данных, но нельзя было бы передать функцию как параметр в другую функцию? Ну и возвратить её как значение.
Далее, данное определение чуть более чем полностью бесполезно, ибо не дает какого-либо профита, смешивая два понятия в одно. Если первое (first class functions) неотвратимо приводит ко второму (hof), зачем вообще иметь два понятия вместо одного?
-
Все очень просто, valexey:
The distinction between the two is subtle: "higher-order" describes a mathematical concept of functions that operate on other functions, while "first-class" is a computer science term that describes programming language entities that have no restriction on their use (thus first-class functions can appear anywhere in the program that other first-class entities like numbers can, including as arguments to other functions and as their return values).
http://en.wikipedia.org/wiki/Functional_programming#First-class_and_higher-order_functions
;)
-
Даже поясню:
Функция первого класса - это компьютерный термин, и определяет три действия:
1. Присвоить переменной
2. Принять аргументом
3. Вернуть
Если убрать первое действие, то получится математическое понятие "Функция высшего порядка" ;)
-
Все очень просто, valexey:
The distinction between the two is subtle: "higher-order" describes a mathematical concept of functions that operate on other functions, while "first-class" is a computer science term that describes programming language entities that have no restriction on their use (thus first-class functions can appear anywhere in the program that other first-class entities like numbers can, including as arguments to other functions and as their return values).
http://en.wikipedia.org/wiki/Functional_programming#First-class_and_higher-order_functions
;)
Мы сейчас пойдем уже по второму кругу :-)
Еще раз процитирую оттуда же:
Higher-order functions enable partial application or currying, a technique in which a function is applied to its arguments one at a time, with each application returning a new function that accepts the next argument. This allows one to succinctly express, for example, the successor function as the addition operator partially applied to the natural number one.
А между прочим, пока мы ходим кругами, никто не задался вопросом - что такое функция, и чем от нее отличается указатель на оную функцию :-)
-
Если в языке возможен карринг, то возможен исключительно благодаря этим самым hof, но отсутствие карринга не является признаком отсутствия hof.
А про функцию и указатель: передача функции по ссылке так же законна, как и по значению.
hof - это элемент функционального языка, а не язык целиком, и не надо переносить с ФЯ на hof всё его содержание.
-
До-о! Мелкософт конечно знатоки функциональщины!
Вообще-то да. Ведь основные работы по тому же хаскелю ведутся в Microsoft Research, да и F# тоже достаточно развит в плане ФП...
-
Higher-order functions enable partial application or currying, a technique in which a function is applied to its arguments one at a time, with each application returning a new function that accepts the next argument. This allows one to succinctly express, for example, the successor function as the addition operator partially applied to the natural number one.
Что в данном месте переводится "разрешают". Не вижу ничего противоречащего моим словам.
Вот если бы там было написано: "ФВП определяются наличием currying'а"...
ps И что такое функция в программировании? :)
-
Если в языке возможен карринг, то возможен исключительно благодаря этим самым hof, но отсутствие карринга не является признаком отсутствия hof.
А про функцию и указатель: передача функции по ссылке так же законна, как и по значению.
hof - это элемент функционального языка, а не язык целиком, и не надо переносить с ФЯ на hof всё его содержание.
Везде имелось ввиду именно передача по значению (first class values).
-
Отображение на яп некоторого вспомогательного алгоритма, иловб, более корректный ьермин - подпрограмма
-
DIzer, не понял к чему вы это. Поясните плиз.
-
Вы спросили- что такое функция в прогоаммировании - я ответил
-
А я тут гадаю... ;D
Ну вопрос вообще к valexey был.
А между прочим, пока мы ходим кругами, никто не задался вопросом - что такое функция, и чем от нее отличается указатель на оную функцию :-)
-
Вы спросили- что такое функция в прогоаммировании - я ответил
Это никак не отвечает на поставленный мною вопрос :-)
-
Я отвечал не на ваш вопрос, Алексей. а на Иловб
-
;D ;D ;D
Последние 6 постов доставляют.
-
;D ;D ;D
Последние 6 постов доставляют.
Кстати, да. Напоминают игру "сломанный телефон".
-
да нет - просто тяжко отвечать развернуто через телефон в движущемя междугороднем автобусе
-
Вставлю свои две копейки.
1. Указатель на функцию и функция - сильно разные вещи в императивных языках обычно. Указателя на функцию в языке может и не быть, а функции - по-любому присутствуют.
В Паскале указателей на функцию нет, а есть процедурный тип. Его реализация под капотом, скорее всего - тоже указатель, но ведь в самом языке его нет!
Путаница ИМХО пошла с Си, поскольку там было правило: имя функции = константа-указатель на функцию (того же типа).
2. ИМХО функции высших порядков лучше всего смотреть в Лиспе. Там список и функция - близнецы-братья.
Возвращаемый список может быть функцией (списком) сформированным во время работы программы. И тут же во время работы программы эту функцию можно выполнить.
В императивном языке вроде Си нельзя во время программы сформировать функцию на Си и тут же ее выполнить. Как минимум потребуется вызов компилятора.
Вот БлэкБокс (не Компонентный паскаль!) такое вроде позволяет... :)
-
Вставлю свои две копейки.
1. Указатель на функцию и функция - сильно разные вещи в императивных языках обычно. Указателя на функцию в языке может и не быть, а функции - по-любому присутствуют.
В Паскале указателей на функцию нет, а есть процедурный тип. Его реализация под капотом, скорее всего - тоже указатель, но ведь в самом языке его нет!
Стоп. А чем оно от оного указателя (или ссылки) отличается? Кроме названия в документации. Термины не интересны, интересна суть.
2. ИМХО функции высших порядков лучше всего смотреть в Лиспе. Там список и функция - близнецы-братья.
Возвращаемый список может быть функцией (списком) сформированным во время работы программы. И тут же во время работы программы эту функцию можно выполнить.
В императивном языке вроде Си нельзя во время программы сформировать функцию на Си и тут же ее выполнить. Как минимум потребуется вызов компилятора.
В случае именно что Си - не потребуется. То есть это сделать таки можно. Но, как водится, не портабельно.
Вот БлэкБокс (не Компонентный паскаль!) такое вроде позволяет... :)
Без вызова компилятора? Не верю :-)
-
А на Си как? Типа сделать массив под размер кода функции, напихать туда динамически маш кодов, получить указатель на начало массива и вернуть это как функцию? ;)
Я такое еще в школе на васике сооружал ;D
-
А на Си как? Типа сделать массив под размер кода функции, напихать туда динамически маш кодов, получить указатель на начало массива и вернуть это как функцию? ;)
Я такое еще в школе на васике сооружал ;D
Угу. Это дело широко применяется для "jit-компиляции" всяких выражений прямо внутри программы. Например так можно собрать regexp который будет в результате нифига не интерпретироваться.
-
В ЧЯ в принципе тоже можно, если импортировать SYSTEM
-
В ЧЯ в принципе тоже можно, если импортировать SYSTEM
Там проще позвать компилятор :-)
-
В Паскале указателей на функцию нет, а есть процедурный тип. Его реализация под капотом, скорее всего - тоже указатель, но ведь в самом языке его нет!
Стоп. А чем оно от оного указателя (или ссылки) отличается? Кроме названия в документации. Термины не интересны, интересна суть.
2. ИМХО функции высших порядков лучше всего смотреть в Лиспе. Там список и функция - близнецы-братья.
Возвращаемый список может быть функцией (списком) сформированным во время работы программы. И тут же во время работы программы эту функцию можно выполнить.
В императивном языке вроде Си нельзя во время программы сформировать функцию на Си и тут же ее выполнить. Как минимум потребуется вызов компилятора.
В случае именно что Си - не потребуется. То есть это сделать таки можно. Но, как водится, не портабельно.
Вот БлэкБокс (не Компонентный паскаль!) такое вроде позволяет... :)
Без вызова компилятора? Не верю :-)
1. Процедурный тип - это все же не указатель. Указатель - это машинно-ориентированный тип, а процедурный - это на уровне языка - от машины не зависит.
2. Наверное, в современном Си можно. А в С++ - никак.
3. Да, конечно, я имел ввиду, в БлэкБоксе, а не в языке.
Тем не менее, функции высших порядком - это ж практически объекты. Их можно создавать, передавать, получать, выполнять - и все это в процессе работы программы. А указатель на функцию - это машинно-ориентированный объект.
-
Процедурный тип - это все же не указатель.
Да, точнее не обязательно таковым является - что это такое в ЯВУ определяется его реализацией
Указатель - это машинно-ориентированный тип
Нет - все зависит от уровня его определения в конкретном ЯВУ
процедурный - это на уровне языка - от машины не зависит.
опять же зависит от уровня определения - как и остальные типы и их экземпляры(переменные)
Например - классическое определение массива в ЯВУ - набор однотипных переменных, к каждой из которых можно обратится по номеру (индексу), и время доступа не зависит от номера переменной.. Низкоуровневое определение массива в языках среднего и низкого уровня ДЕКЛАРИРУЕТ еще и информацию о "структуре" переменной - например, как непрерывный набор ячеек в некотором адресном пространстве (СИ/C++)
-
1. Процедурный тип - это все же не указатель. Указатель - это машинно-ориентированный тип, а процедурный - это на уровне языка - от машины не зависит.
Давай не растекаться мыслью по дереву. Чем конкретно паскалевский процедурный тип от сишной функции (константный указатель на константу имеющий тип функции) отличается? Что можно сделать с одним такое чего нельзя сделать с другим, и наоборот.
2. Наверное, в современном Си можно. А в С++ - никак.
Почему? То есть я не вижу никаких проблем для плюсов - в данном случае там будет ровно то же что и в сях. (более того, я это делал, и видел как делают другие).
3. Да, конечно, я имел ввиду, в БлэкБоксе, а не в языке.
Тем не менее, функции высших порядком - это ж практически объекты. Их можно создавать, передавать, получать, выполнять - и все это в процессе работы программы. А указатель на функцию - это машинно-ориентированный объект.
Из пустого в порожнее получается :-) Понимаешь, если мы мыслим в терминах "все есть объект", то куда ни плюнь попадешь именно в объект (функция это, целочисленная переменная или что-то еще). Причем если смотреть с этой колокольни, то мы увидим объекты вообще в любом языке. Но есть нюанс - задекларировав что у нас все есть объект, знаний дополнительных не получаем.
PS. В твоем третьем пункте, видимо, стоит заменить "функции высших порядков" на просто функции. Ибо ФВП сама по себе какой-то дополнительной "объектностью" относительно просто функции не обладает.
-
Кстати просмотрел тут по диагонали главу 1.3 Formulating Abstractions with Higher-Order Procedures из SICP
http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-12.html#%_sec_1.3
Вроде как все примеры можно переписать на Oberon.
-
Кстати просмотрел тут по диагонали главу 1.3 Formulating Abstractions with Higher-Order Procedures из SICP
http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-12.html#%_sec_1.3
Вроде как все примеры можно переписать на Oberon.
Если таки перепишите на Оберон, добавьте сюда:
http://sicp.org.ua/sicp/Section1-3
Я как-то начинал там примеры на обероне приводить, да запал быстро пропал почему-то...
-
OK, я и так планировал этим заняться. Но обещать не буду :) Планы у меня наполеоновские как всегда, а возможности сильно ограничены.