Функциональное программирование |
Функциональное программирование всегда привлекало меня в противопоставлении к императивному.
Я очень часто обсуждаю различные аспекты функционального программирования на различных ветках на Базарной площади.
Но хотелось бы собрать всех заинтересованный этой темой в одной ветке.
Я думаю что настало время открыть такую тему. И вот почему.
Исторически функциональное программирование появилось практически вместе с императивным.
Вторым языком после фортрана был лисп.
Но увы, функциональное программирование надолго было уделом исследовательских институтов или специализированных приложений (Искусственный Интеллект)
Конечно не надо считать весь мир дураками из за того что развитие пошло по пути языков Алгол семейства.
Для этого были вполне обьективные причины. Функциональные языки слишком близки к человеку и слишком далеки от машины.
Они сьедают в десятки раз больше рессурсов чем императивные языки.
Вспомните претензии, предявляемые к java - первому императивному языку с виртуальной машиной и сборщиком мусора, толкаемому большими корпорациями в mainstream.
Жутко тормозит, и жрет всю память какая есть. А ведь функциональные языки (далее ФЯ) все без иключения имеют сборщик мусора, виртуальную машину.
Многие из них (семейство лисп) еще и динамические, что только усугубляет положение.
Вполне естественно что появившись более полусотни лет назад они надолго опередилли свое время.
Для широкого распространения ФЯ нужны гигабайты дешевой памяти и гигагерцы дешевых процессоров.
Прошло более 50 лет, прежде чем такие требования к железу стали реальностью.
Это время наступило. СЕЙЧАС.
Добро пожаловать в новую эру программирования.
Jack Of Shadows
Всего в теме 5502 сообщения
Добавить свое сообщение
Отслеживать это обсуждение
- Средства разработки. Языки программирования.
- Delphi 4 or Delphi 5
- Что приобрести в качестве средства разработки?
- Delphi6
- Delphi vs PowerBuilder
- Сравнение компиляторов
- Вот и вышла Delphi 7... Вы рады?
№ 1522 10-11-2006 13:54 | |
Ответ на »сообщение 1521« (Jack Of Shadows)
___________________________
Ах черт! Это же не простенький а очень даже крутой вариант!
Ведь это же лисп! Не нужно ничего писать самому, на то есть макросы.
Запихнуть всю эту машинерию в макрос и обозвать его скажем def-cells-var
Вот и все! Дешево и сердито. :))
Вот вам и простенький метод цепляния к простым типам.
За кулисами (def-cells-var *my-var* 10) преобразуется в создание обьекта CLOS с один слотом и навешанными на него symbol-macros для мимикрии работы с переменной простого типа.
Для пользователя все выглядит точно также как и раньше.
Единственная разница - вместо defvar используется def-cells-var для обьявления "простых" переменных. :))
LISP rules !!
№ 1521 10-11-2006 13:23 | |
Ответ на »сообщение 1519« (Jack Of Shadows)
___________________________
А вот еще простенький вариант был предлжен кем то, через macro symbol :
(define-symbol-macro *xxx* (c-variable-accessor '*xxx*))
(defun (setf c-variable-accessor) (new-value symbol)
(c-variable-write symbol new-value))
(defun c-variable-accessor (symbol)
(c-variable-read symbol))
Тоже вариант, хотя мне не нравится, с обьектами все таки гораздо проще. Но как видите возможностей разнообразных в лиспе много :))
№ 1520 10-11-2006 12:59 | |
Ответ на »сообщение 1519« (Jack Of Shadows)
___________________________
Тьфу, сорвалось:
Однако я думаю понятно, что даже если пойти самым трудным путем и переписать setf, то это возможно и не представляет непреодолимого препятствия.
№ 1519 10-11-2006 12:54 | |
Ответ на »сообщение 1518« (Lisp Hobbyist)
___________________________
Не совсем. :-) Разговор ведь был о том, как можно подцепить присваивание переменным, а MOP здесь не помощник.
Там у нас с вами вышло недоразумение. Я отвечал на вопрос как работает cells (через MOP), а не как цепляться к не CLOS переменным. Поскольку cells не работает с простыми типами, то отвечать на вопрос "как cells работает с простыми типами" бессмысленно :)) Он с нимим и не работает (возможно пока).
Я всего лишь сделал предположение что можно его заставить работать и с простыми типами. Мое предположение основывалось на том что в лиспе в отличие от привычных здесь delphi, java, сишарп, можно поменять все что угодно, ВКЛЮЧАЯ и макросы defvar, defparameter, и seft.
Как выясняется так оно и есть.
Однако вполне возможно что был избран легкий путь переопределения defvar, defparameter и введения нового макроса вместо setf, скажем c-setf
Это гораздо легче, чем связываться с setf.
Я поробую еще позадавать вопросы на cells mailing list. Может че и прояснится.
Однако я думаю понятно, что даже если пойти самым трудным путем и переписать setf, то это возможно и не представляет.
Кстати Кенни обьяснил почему его не интересует поддержка простых типов.
Простые типы в основном используются в качестве локальных переменных, с коротким сроком жизни.
Привязываться к ним нет никакого смысла. Связывать нужно бывает только данные которые долго живут.
А такие данные как правило имеют сложную структуру, то есть представлены обьектами.
№ 1518 10-11-2006 12:35 | |
Ответ на »сообщение 1517« (Jack Of Shadows)
___________________________
>>> Более того, он даже называет конкретный чудо-механизм, который якобы это обеспечивает:
Спасибо что оставили мне хотя бы один процент шанса. :))
Вероятно он в вас и выстрелил.
Не совсем. :-) Разговор ведь был о том, как можно подцепить присваивание переменным, а MOP здесь не помощник. Так что его упоминание в »сообщение 1483« было все равно не в тему.
Кенни ответил. И сказал что во первых сейчас встраивает с cells поддержку defstruct, что уже через MOP не сделаешь.
Спасибо за информацию. Впрочем, это как раз не так и удивительно, поскольку доступ к полям структур все равно проходит только через соотв. accessors. Вопрос лишь в том, можно ли их "подцепить" стандартным способом.
А во вторых некоторые из пользователей cells добавили туда поддержку обычных (не CLOS) переменных, обьявляемых через defvar и defparameter. Хотя ему лично они не нужны (мне тоже). Но вот кому то понадобилось, и сделали же.
Вот это, действительно, сюрприз. А где опубликован этот код? Не исключено, что там вводятся какие-то ограничения на использование переменных.
№ 1517 10-11-2006 11:52 | |
Ответ на »сообщение 1515« (Lisp Hobbyist)
___________________________
Более того, он даже называет конкретный чудо-механизм, который якобы это обеспечивает:
Спасибо что оставили мне хотя бы один процент шанса. :))
Вероятно он в вас и выстрелил.
Кенни ответил. И сказал что во первых сейчас встраивает с cells поддержку defstruct, что уже через MOP не сделаешь.
А во вторых некоторые из пользователей cells добавили туда поддержку обычных (не CLOS) переменных, обьявляемых через defvar и defparameter. Хотя ему лично они не нужны (мне тоже). Но вот кому то понадобилось, и сделали же.
№ 1516 10-11-2006 05:51 | |
Ответ на »сообщение 1510« (Jack Of Shadows)
___________________________
>>>Особенно хорошо на этапе компиляции ловится зацикливание вычисляемых ссылок, типа Excel'ного OFFSET...
OFFSET это работа с относительной адресацией ячеек, это к си а не к лиспу :))
лисп с адресами памяти не работает :)) По моему в нем даже указателей в сишном понимании этого слова, нет.
Зато в Лиспе есть такая замечательная штука, как (slot-value foo bar), где имя слота тоже является вычисляемым во время исполнения. На статический анализ зацикливания это ИМХО может повлиять не хуже OFFSET'а, и даже без всякого eval.
№ 1515 10-11-2006 05:45 | |
Ответ на »сообщение 1509« (Jack Of Shadows)
___________________________
Вы правы я именно defsetf имел в виду. Хороший вопрос.
Я попробую задать его Тилтону. Посмотрим что он думает по этому поводу.
С вероятностью 0.99 он ответит, что и не ставил себе целью обеспечить работу cells с произвольными переменными. Перехват setf нужен только для этого --- для CLOS-объектов достаточно средств MOP.
В любом случае как я уже говорил, полезность сеlls для простых типов (не обьектов) мне кажется сомнительной, и данный вопрос имеет чисто теоретическое а не практическое значение, в отличие от cells, который очень практичен в его нынешней реализации.
Я-то согласен, что cell-объектов на практике хватит. Но вот автор этого сообщения ( »сообщение 1454«) рассуждает о применении cells к необъектным данным как о чем-то уже существующем:
cells при желании можно использовать с любым типом данных а не только с обьектами.
Например
var
x, y : integer
x := ?f: y+5;
После чего меняете значение y и наблюдаете как автоматом меняется значение x.
Вот такой вот своеобразный OnChange навешенный на простенький integer.
Более того, он даже называет конкретный чудо-механизм, который якобы это обеспечивает:
>>> Вопрос. КАК cells узнает об изменении значения y?
Через MOP (Meta Object Protocol)
Вам стало легче ? :)) Предупреждаю сразу, MOP я вам разжевывать не буду. Читайте книжки.
Как говорится, на каждый сложный вопрос можно дать ответ, который будет простым, коротким и неправильным.
№ 1514 10-11-2006 02:56 | |
№ 1513 10-11-2006 02:55 | |
Ответ на »сообщение 1512« (Max Belugin)
___________________________
Не ну если постараться то можно и поломать конечно, я не спорю. :))
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|