Обоснование концепции "code as data" - Lisp
Формулировка задачи:
Как известно, Ъ-лиспы обладают этим свойством, более того, примерно до 70-х вообще, практически все лиспы им обладали, и это было основной фичей. Однако, для этой концепции никогда не было четкого семантического основания. Я восполню этот пробел.
Абсолютно четкое основание можно дать с позиции Модели Акторов.
Суть тут в подходе к концепции данных.
Если в маломощных языках данные трактуются как нечто предопределенное, например, если это список значит это только список, и ничего другое, то с точки зрения лиспа тип выражения определен не на уровне языка, а на уровне актора, который принимает сообщения. Соответственно, получая одно и то же сообщение в виде, например, лямбда-выражения, один актор -- ленивая функция, трактует его как список, и работает как со списком, а другой-энергичная функция -- как функцию.
То есть, основная идея тут в том, что нет никаких заранее определенных типов данных, тип конкретного полученного сообщения трактуется субъективно, конкретным получателем.
Эти идеи впоследствии получили некоторое развитие в ООП, а лисп-культура, напротив, отошла от этой мощной концепции, деградировав до алголоподобия.
Решение задачи: «Обоснование концепции "code as data"»
textual
Листинг программы
(defun make-function-number-plus (n m) (loop for a from n to m do (let ((a a)) (setf (symbol-function (add-plus a)) (lambda (z) (+ z a)))))) (defun add-plus (a) (intern (format nil "~A+" a))) CL-USER> (make-function-number-plus 2 10) NIL CL-USER> (7+ 1000) 1007
Объяснение кода листинга программы
- Функция
make-function-number-plusпринимает два аргументаnиm. - В цикле
loopперебирает все числа отnдоm. - Для каждого числа
aсоздается новая функция с помощьюlambda, которая добавляетaк любому числу. - Функция
add-plusпринимает аргументaи создает новую функцию с именем, содержащимa, с помощьюinternиformat. - Функция
add-plusвызывается с аргументом1000и возвращает новую функцию. - Новая функция вызывается с аргументом
7и возвращает результат1007.