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

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 b c) (* (+ a b) c))
> (two-op 1 2 3)
9
> (swap-ops)
+
> two-op
(lambda (a b c) (+ (* a b) c))
> (two-op 1 2 3)
5
Что отсюда можно и нужно уяснить?

1. Нет никакой принципиальной разницы между кодом (инструкциями) и данными. Причем не в "голой" лишь теории, а в самой что ни на есть практической практике, прямо в рантайме и прямо на уровне самого языка, а не "подлежащих" машинных кодов. И код, и данные суть просто s-выражения, сиречь списки.

2. Следствие из (1): для модификации программы (заметьте хорошенько: на просто "поведения программы", а именно самой программы как "синтаксического дерева") нет нужды останавливать ее, править исходник и запускать заново -- изменения в исполняемый код можно вносить прямо "на лету". Более того: делать это -- переписывать себя -- может сама запущенная программа (собс-но, ради этой возможности Лисп и был придуман, и именно поэтому он таков, каков он есть).

3. Поскольку синтаксически у нас нет никаких других сущностей кроме атомов, списков и их разделителей (скобки и пробелы), то нам, собственно говоря, не нужен и никакой особенный синтаксис -- можно считать, что такой штуки у нас вообще нет. А стало быть, [почти] нет и налагаемых им ограничений -- нет целого пласта "в лице" сложной системы правил расстановки закорючек, который в прочих языках стоит между нашей мыслью и вычислительной машиной. Что вкупе с (2) объясняет, помимо прочего, и то, почему лисперы смотрят на другие языки (как средства разработки программ) как... ну, в этом месте уже должно быть понятно -- как смотрят.

А опирается все это волшебство на гениальное соединение двух простых вещей -- уже упомянутой списочной структуры кода/данных и цикла read-eval-print. Просто, как молоток, и столь же незаменимо. Именно из-за этой незаменимости (чем можно заменить молоток?!!) вот уже более полувека создатели прочих языков тырят заимствуют из Лиспа идеи, но никто из них так и не снискал признания как изобретатель языка, "закрывающего" или "отменяющего" Лисп. Вещи уровня молотка не в каждом тысячелетии изобретаются!

ЗЫ А вот, кстати, маленькая (13 страниц!) статья Пола Грэма "The Roots of Lisp" (в PostScript), в которой этот талантливый популяризатор раскрывает самую суть открытия (Грэм специально замечает, что это было "не столько изобретение, сколько открытие") Маккарти, "отца" Лиспа.

Что же до прочего, то я считаю, что частная собственность должна быть уничтожена.

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

Previous post Next post
Up