Оберон-технология: особенности и перспективы |
Тематика обсуждения: Оберон-технология. Особенности, перспективы, практическое применение.
Всего в теме 6256 сообщений
Добавить свое сообщение
Отслеживать это обсуждение Обсуждение из раздела Школа ОБЕРОНА
№ 5236 26-09-2007 15:55 | |
Ответ на »сообщение 5234« (Сергей Перовский)
___________________________
Вспоминая прежние задачи, ни нашел ни одного случая, когда функция была настолько простой, что ее удобно было бы описать прямо в качестве фактического параметра. Мы какие то очень разные области программирования рассматриваем.
А вот пример на Хаскелле. Как известно, циклов там нет, но иногда нужны. Допустим, нужно в теле процедуры проделать какие-то действия над списком данных. Можно использовать функции, в том числе - анонимные:
main = do
forM [1..100] $ \i -> do
result <- process i
print result Оператора for в языке нет, имитируется функцией forM, которой подаётся список (в данном случае - чисел от 1 до 100) и анонимная функция с параметром i, который здесь выполняет роль счётчика цикла...
№ 5235 26-09-2007 15:51 | |
Ответ на »сообщение 5234« (Сергей Перовский)
___________________________
Мы какие то очень разные области программирования рассматриваем.
Еще бы :)) Имена этим разным областям программирования - императивное и функциональное.
И я как программист ежедневно бывающий по обе стороны баррикады (пишу на лиспе и на delphi,java,csharp) могу полностью подтвердить. Я тоже не передаю функции в качестве параметров и тем более не возвращаю их как результат, когда работаю на императивных языках. Обьекты самое то.
Однако вот что странно. Стоит мне перейти на лисп - и передача функций встречается у меня же практически на каждой строчке.
Когда читал книгу по хаскелю и писал учебные программки - та же история.
Хотя вроде задачи одни и те же. С чего бы это ? :))
№ 5234 26-09-2007 15:41 | |
Ответ на »сообщение 5232« (Jack Of Shadows)
___________________________
Для того чтобы техникой передачи функций как параметров никто не пользовался даже не нужно ее запрещать. Достаточно сделать ее неудобной, убрав анонимные функции. И 99% программистов никогда не будут передавать функции в качестве параметров. Слишком много возни.
Мне приходилось довольно часто передавать в качестве параметров функции.
Теперь предпочитаю передавать объекты-обработчики.
Вспоминая прежние задачи, ни нашел ни одного случая, когда функция была настолько простой, что ее удобно было бы описать прямо в качестве фактического параметра. Мы какие то очень разные области программирования рассматриваем.
№ 5233 26-09-2007 14:18 | |
Ответ на »сообщение 5230« (Trurl)
___________________________
>>>даже локальные функции нельзя передавать в качестве аргументов другим функциям, что, впрочем, без анонимных функций пользы не даёт особой...
А чем именованные функции хуже анонимных?
Ну, если на примере Оберонов, то тем, что именованные функции нельзя использовать как closure - локальные не передашь наружу, а глобальную не сделаешь замыканием...
Анонимные фынкции (лямбды) - это ведь динамические сущности, тогда как именованные - статичны.
Вот например, попробуем симитировать ленивые бесконечные списки на Обероне, или вообще просто отложенные вычисления (модель call-by-need)... Элемент, хранящий в себе такое отложенное вычисление, будет выглядеть примерно так:
(флаг_проведённого_вычисления, результат, функция_вычисляющая_значение)
Удобно ли будет помещать в этот кортёж именованную функцию (да ещё и глобальную), содержащую некий нужный нам в этом конкретном месте расчёт в виде машинного кода? Думаю, что нет.
В Оберонах скорее придётся создать некий объект, который будет содержать в себе список действий, своего рода AST, который по сути будет интерпретироваться...
№ 5232 26-09-2007 13:28 | |
Ответ на »сообщение 5230« (Trurl)
___________________________
А чем именованные функции хуже анонимных?
Неудобством, громоздкостью при частом использовании.
Сравните:
function MyFunc(x, y)
begin
return x + y
end
ProcessListOfPairs(myList, MyFunc)
и
ProcessListOfPairs(myList, (x,y) -> x + y)
Для того чтобы техникой передачи функций как параметров никто не пользовался даже не нужно ее запрещать. Достаточно сделать ее неудобной, убрав анонимные функции. И 99% программистов никогда не будут передавать функции в качестве параметров. Слишком много возни.
№ 5231 26-09-2007 13:11 | |
Ответ на »сообщение 5229« (Стэн)
___________________________
ABC has only five basic datatypes.
В таком случае стоит взглянуть на творение Мартина Ричардса, язык BCPL. Ричардс обкорнал CPL. С языка BCPL Деннис Ритчи строил сначала свой B, а потом и C. Опять-таки, BCPL генерировал O-код для виртуальной машины.
http://en.wikipedia.org/wiki/BCPL
A major reason for the compiler's portability lay in its structure. It was split into two parts: the front end parsed the source and generated O-code for a virtual machine, and the back end took the O-code and translated it into the code for the target machine... The language is unusual in having only one data type: a word, a fixed number of bits, usually chosen to align with the architecture's machine word and of adequate capacity to represent any valid storage address.
Читать лучше описание, а не Wikipedia:
"The BCPL Reference Manual". Martin Richards (1967)
http://www.europrog.ru/book/bcri1967e.pdf (PDF, 50 Кбайт)
Описание языка BCPL и O-кода см.
"The BCPL Cintcode System and Cintpos User Guide"
http://www.cl.cam.ac.uk/users/mr/bcplman.pdf (PDF, 700 Кбайт)
Думаю, речь должна идти не о минимализме, а о сбалансированности, гармоничности языка, построенного на принципах концептуальной экономии. Лисп, например, построен на этих принципах, но он не позволяет получать прозрачный доступ к традиционной архитектуре Эккерта-Неймана. Тыкать в битики пальцем.
№ 5230 26-09-2007 12:53 | |
Ответ на »сообщение 5227« (Geniepro)
___________________________
>>>даже локальные функции нельзя передавать в качестве аргументов другим функциям, что, впрочем, без анонимных функций пользы не даёт особой...
А чем именованные функции хуже анонимных?
№ 5229 26-09-2007 12:40 | |
Ответ на »сообщение 5228« (panda)
___________________________
>>> Вот тут я понимаю ван Россума с его минимализмом :)
http://en.wikipedia.org/wiki/Guido_van_Rossum
http://en.wikipedia.org/wiki/ABC_programming_language
ABC has only five basic datatypes. It does not require variable declarations. It has explicit support for top-down programming. Statement nesting is indicated by indentation. It provides infinite precision arithmetic, unlimited sized lists and strings, and other features supporting orthogonality and ease of use by novices. Its designers claim that ABC programs are typically around a quarter the size of the equivalent Pascal or C programs, and more readable.
№ 5228 26-09-2007 12:31 | |
Ответ на »сообщение 5226« (Александр Феоктистов)
___________________________
всякие форичи итд не кажутся мне таковыми, зачем пудрить мозги ещё одной сущностью, их и так расплодилось много :)
вот тут я понимаю Вирта с его минимализмом.
Всякие форы [по индексам] и т.д. не кажутся мне таковыми, зачем пудрить мозги ещё одной сущностью, их и так расплодилось много. Вот тут я понимаю ван Россума с его минимализмом :)
Чем мое высказывание хуже Вашего? ;-)
№ 5227 26-09-2007 10:52 | |
Ответ на »сообщение 5219« (Geniepro)
___________________________
Простейшее переписывание с массива на линейный список почти не сказалось на скорости - расчёт миллионного простого числа замедлилось с 18.1 сек лишь до 18.3, уже влияние оказывает локальность/глобальность переменной, содержащей этот список (18.3 сек при локальной plist, и 18.5 при глобальной)...
TYPE INTLIST = POINTER TO RECORD
value : INTEGER;
next : INTLIST;
END;
PROCEDURE PrimeList(n : INTEGER) : INTEGER;
VAR plist : INTLIST;
y, ys : INTLIST;
nn : INTEGER;
p : INTEGER;
PROCEDURE IsPrime(x : INTEGER) : BOOLEAN;
VAR isP : BOOLEAN;
pl : INTLIST;
BEGIN
isP := TRUE;
pl := plist.next;
WHILE isP & (pl.value*pl.value <= x) DO
isP := (x MOD pl.value) # 0;
pl := pl.next
END;
RETURN isP
END IsPrime;
BEGIN
nn := n;
y := NIL;
WHILE nn > 0 DO
NEW(ys); ys.next := y; y := ys;
DEC(nn)
END;
plist := ys;
ys.value := 2; ys := ys.next;
ys.value := 3; ys := ys.next;
nn := 2;
p := 5;
WHILE nn < n DO
IF IsPrime(p) THEN
y := ys;
ys.value := p;
ys := ys.next;
INC(nn)
END;
INC(p, 2)
END;
RETURN y.value
END PrimeList; Но этот код совершенно ещё не соответствует хаскелловскому - нет ни ленивых вычислений, ни бесконечных списков, ни фильтрации готовых списков...
Надо подумать над этим, глядишь - рантайм для Хаскелла получится... :о))
Вот что в Оберонах плохо - нет полиморфизма (или хотя бы дженериков), и процедуры не являются полноценными гражданами первого класса - нет анонимных функций, и даже локальные функции нельзя передавать в качестве аргументов другим функциям, что, впрочем, без анонимных функций пользы не даёт особой...
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|