Песочница

Код — это данные

Цитированный список и вызов — одна и та же форма, и понимание одного этого факта объясняет почти всё, чем отличается это семейство языков.

Результат: объяснить, почему программа на этом языке состоит из тех же списков, которыми программа управляет, и почему это полезно, а не просто диковинка.

Что нужно знать: Чтение скобок. Больше ничего.

Одна и та же форма означает две вещи

Эту форму вы уже знаете.

LISPEX
(+ 2 3)

Применённая, она даёт пять. Теперь поставьте перед ней апостроф.

LISPEX
'(+ 2 3)

Получается список из трёх элементов: symbol +, число два и число три. Ничего не сложилось и не вычислилось. Апостроф говорит: считай это данными, а не тем, что нужно выполнить.

Один и тот же текст — вызов или список, и зависит это только от того, просили ли вы его выполнить. В большинстве языков вызов функции и список из трёх элементов — несвязанные вещи, которые просто обе используют знаки препинания. Здесь это одна вещь, увиденная с двух сторон.

Почему это важно в обычном коде

Чтобы это окупилось, не нужно писать компилятор. Оно проявляется в первый же раз, когда программа возвращает решение вместо числа.

LISPEX
(define answer '(decision allow))
(list (car answer) (car (cdr answer)))

Результат — (decision allow). Программа построила маленький кусок структурированных данных ровно той записью, которой написана сама, и разобрала его обычными операциями над списками. Не понадобился ни отдельный синтаксис для литералов, ни выбор формата сериализации, ни объектная модель, которую надо описать заранее.

Это повседневная версия идеи. Программа, которая производит структуру, производит то же самое, из чего сделана сама, поэтому инструменты для одного работают и для другого.

Цитирование и его семейство

У цитирования есть родственники, с которыми вы встретитесь позже.

LISPEX
'x
`x
,x
,@xs

Первое — цитирование: считать данными. Второе — квазицитирование: считать данными, но разрешить пропуски. Третье заполняет пропуск вычисленным значением, четвёртое заполняет пропуск, вставляя в него список. Они нужны, чтобы программа могла строить структуру, которая почти вся фиксирована, а несколько частей подставляются.

Сейчас они вам не нужны. Знание о том, что они есть, избавит от удивления, когда вы увидите обратный апостроф, а это окажется не строка.

Честная оговорка

Знаменитое следствие того, что код — это данные: программы могут писать программы. Это правда, и это же не то, чем занимается большинство рабочего кода. Большинство рабочего кода выигрывает скромнее, как показано выше: единая запись и один набор инструментов.

Относитесь к громкой версии как к открытой двери, а не как к комнате, в которую обязательно нужно войти.

Попробуйте сами

Предскажите оба результата до запуска.

LISPEX
(list (+ 1 2) '(+ 1 2))
Показать ответ

(3 (+ 1 2)). Первый элемент вычислился и стал тройкой. Второй был процитирован, поэтому остался списком из трёх элементов. Один и тот же текст, два исхода, и решает всё апостроф.

Готовы двигаться дальше?

Вы можете сказать, что делает апостроф, привести пример программы, возвращающей структурированные данные, и объяснить, почему совпадение записи для данных и записи для вызовов удобно, а не запутывает.

Далее: Данные, условия и решения — там из этих самых кусочков строятся настоящие правила.