Почему "все языки делятся на две группы: Лисп и все прочие" ((ц) не помню кто)? А вот почему:
Определим пару функций:
(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... )
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