Обоснование концепции "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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д