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