Обоснование концепции "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

Объяснение кода листинга программы

  1. Функция make-function-number-plus принимает два аргумента n и m.
  2. В цикле loop перебирает все числа от n до m.
  3. Для каждого числа a создается новая функция с помощью lambda, которая добавляет a к любому числу.
  4. Функция add-plus принимает аргумент a и создает новую функцию с именем, содержащим a, с помощью intern и format.
  5. Функция add-plus вызывается с аргументом 1000 и возвращает новую функцию.
  6. Новая функция вызывается с аргументом 7 и возвращает результат 1007.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.786 из 5
Похожие ответы