Почему "все языки делятся на две группы: Лисп и все прочие" ((ц) не помню кто)? А вот почему:
Определим пару функций:
(define (two-op a b c )
(* (+ a b) c))
(define (swap-ops , new-head)
(setq new-head (nth '(1 1 0) two-op))
(setf (nth '(1 1 0) two-op) (nth '(1 0) two-op))
(setf (nth '(1 0) two-op) new-head))
Пощупаем:
> two-op
(lambda (a
(
Read more... )
И производительность - полное говно, да. Так всегда бывает, когда что-то лишнее выносят в рантайм, особенно если оно тебе не нужно. (Если будет желание вспомнить Stalin, я сразу предложу привести на нём вышеописанный пример, спрошу, являются ли все реализации лиспа Stalin, и является ли его оптимизиатор sound and complete, т.е. сможет ли он корректно оптимизировать все лисповые программы).
Код и данные это не просто "списки", это индуктивный тип на полстраницы из-за всех #t, #f, нилов и прочего говна.
>> Поскольку синтаксически у нас нет никаких других сущностей кроме атомов, списков и их разделителей (скобки и пробелы), то нам, собственно говоря, не нужен и никакой особенный синтаксис -- можно считать, что такой штуки у нас вообще нет.
Гоните, батенька. quote, unquote, quasiquotation, не? Или скажешь, что в eval они не рассматриваются как специальный случай?
>> А стало быть, [почти] нет и налагаемых им ограничений -- нет целого пласта "в лице" сложной системы правил расстановки закорючек, который в прочих языках стоит между нашей мыслью и вычислительной машиной.
Ты хотел сказать "правил подсчёта идиотских смайликов в конце функции"? Просто это в лиспе есть проблема в виде "error at )))))))))))))))))))))))".
И да, братюнь, пора проснуться и увидеть Template Haskell. То же самое квазиквотирование, только без говна мамонта в виде подлежащего языка пятидесятых годов.
>> нет нужды останавливать ее, править исходник и запускать заново -- изменения в исполняемый код можно вносить прямо "на лету"
Эрланг
Reply
За скоростью можно и в Си-либу слазить, пусть жужжит, делов-то.
> Гоните, батенька. quote, unquote, quasiquotation, не? Или скажешь, что в eval они не рассматриваются как специальный случай?
Написано же: у нас. То есть у тех, кто руками расставляет скобочки, а не у маленького железного человечка, который бегает по веткам eval'овского cond и отыскивает значения :) Но даже и тот железный человечек разбирает все формы, включая "специальные", как случаи единого синтаксиса -- разница тут в семантике, а не в синтаксисе.
> Ты хотел сказать...
Не помню, чтобы мы пили на брудершафт. Красная карточка.
Reply
Полноте, батенька, переходили же на "ты" ещё в бородатом году. Впрочем, как пожелаете :)
Завалялся у меня ещё один аргумент, для прожжёных лисперов. Как насчёт того, что описанная схема относится к антипаттерну action at a distance?
Reply
Reply
Суть антипаттерна такова. Есть фрагмент кода с вполне ожидаемой семантикой. Его семантика _внезапно_ меняется от другого весьма удалённого фрагмента кода. Получается код с высоким coupling, и для понимания любой отдельной его части приходится читать его весь.
Чтобы такого не происходило, метапрограммирование в таком стиле, как выше, не применяется уже много лет. Для этого придуманы механизмы наподобие параметрического и специального полиморфизма, они способны задокументировать такие эффекты хотя бы в типах. Например, для этого придуманы аппликативные функторы и монады в Haskell. Если требуется больше гибкости, то используют более мощные абстракции: idioms, arrows, generalized arrows (hetmet в haskell) aka circuitries и пр.
Reply
Reply
Буду рад помочь, если что.
Reply
Reply
Leave a comment