Последняя безнадежная попытка достучаться до некоторых

Oct 07, 2012 13:37


Почему "все языки делятся на две группы: Лисп и все прочие" ((ц) не помню кто)? А вот почему:

Определим пару функций:

(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... )

newlisp, lisp, научпоп, программизЬм

Leave a comment

udpn October 7 2012, 10:16:44 UTC
>> 1. Нет никакой принципиальной разницы между кодом (инструкциями) и данными. Причем не в "голой" лишь теории, а в самой что ни на есть практической практике, прямо в рантайме и прямо на уровне самого языка, а не "подлежащих" машинных кодов. И код, и данные суть просто s-выражения, сиречь списки ( ... )

Reply

rexy_craxy October 7 2012, 10:40:52 UTC
> И производительность - полное говно.

За скоростью можно и в Си-либу слазить, пусть жужжит, делов-то.

> Гоните, батенька. quote, unquote, quasiquotation, не? Или скажешь, что в eval они не рассматриваются как специальный случай?

Написано же: у нас. То есть у тех, кто руками расставляет скобочки, а не у маленького железного человечка, который бегает по веткам eval'овского cond и отыскивает значения :) Но даже и тот железный человечек разбирает все формы, включая "специальные", как случаи единого синтаксиса -- разница тут в семантике, а не в синтаксисе.

> Ты хотел сказать...

Не помню, чтобы мы пили на брудершафт. Красная карточка.

Reply

udpn October 7 2012, 11:29:46 UTC
>> Не помню, чтобы мы пили на брудершафт. Красная карточка.
Полноте, батенька, переходили же на "ты" ещё в бородатом году. Впрочем, как пожелаете :)

Завалялся у меня ещё один аргумент, для прожжёных лисперов. Как насчёт того, что описанная схема относится к антипаттерну action at a distance?

Reply

rexy_craxy October 7 2012, 11:32:26 UTC
Мы что, лично знакомы? Последней строки вообще не понял.

Reply

udpn October 7 2012, 11:48:17 UTC
Нет, не знакомы.

Суть антипаттерна такова. Есть фрагмент кода с вполне ожидаемой семантикой. Его семантика _внезапно_ меняется от другого весьма удалённого фрагмента кода. Получается код с высоким coupling, и для понимания любой отдельной его части приходится читать его весь.

Чтобы такого не происходило, метапрограммирование в таком стиле, как выше, не применяется уже много лет. Для этого придуманы механизмы наподобие параметрического и специального полиморфизма, они способны задокументировать такие эффекты хотя бы в типах. Например, для этого придуманы аппликативные функторы и монады в Haskell. Если требуется больше гибкости, то используют более мощные абстракции: idioms, arrows, generalized arrows (hetmet в haskell) aka circuitries и пр.

Reply

rexy_craxy October 7 2012, 12:14:17 UTC
А, ну бог в помощь. Надо бы как-нибудь пощупать этот ваш Хаскель, что ли...

Reply

udpn October 7 2012, 12:57:47 UTC
Идея неплохая. Надолго задерживаться не стоит, правда. Я сейчас склоняюсь к тому, что лучше всё-таки Scala. Подробнее могут рассказать tomotom, xeno-by, ivan-ghandi, sorhed и akuklev. Они в продуктиве используют.

Буду рад помочь, если что.

Reply

rexy_craxy October 7 2012, 13:07:02 UTC
Хорошо. Доберусь (когда и если) -- обращусь.

Reply


Leave a comment

Up