Почему полезно рассматривать код как данные в lisp

Сейчас я изучаю emacs lisp и удивляюсь, почему это может быть полезно для обработки кода как данных. Какие преимущества такого подхода. Я видел одно объяснение, так как это альтернатива традиционной архитектуре фон Неймана, где существует четкое разделение между данными и кодом. Я хотел бы понять смысл этого решения, понять идею.

Заранее спасибо, Ник.

1 ответ

Решение

Вы можете написать код, который будет писать код для вас. Это можно сделать двумя способами:

  • Во-первых, ваша программа может создать новый код в виде списка и передать его eval функция, которая будет оценивать новый код во время выполнения (однако, eval это то, что вы не должны злоупотреблять - на самом деле, это следует использовать редко, когда вам это действительно нужно). Теоретически вы можете сделать это на языках, которые не обладают свойством гомоизональности, но это будет намного сложнее. Например, в схеме вы можете сделать это
(define form '(x 10))
(set! form (append 'define form)
(eval form (interaction-environment)

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

  • Вы также можете определить макросы. Макрос - это небольшая функция, которая читает что-то похожее на вызов функции, но преобразуется (расширяется) во что-то еще до того, как программа начинает оценивать формы (то есть до того, как она запускается). Например, во многих Лиспах or это макрос. Этот код,
(or a b c)

переводится на

(let ((tmp1 a))
  (if tmp1
      tmp1
      (let ((tmp2 b))
        (if tmp2
            tmp2
            (let ((tmp3 c))
              (if tmp3
                  tmp3
                  #f))))))

Вы могли бы реализовать or как функция, но тогда функция должна будет оценить все свои аргументы перед возвратом. поскольку or является макросом, он не обязательно оценивает все аргументы.

Вы можете прочитать больше о макросах в Википедии и в этой классной книге [помимо нескольких других мест в сети, например, здесь, здесь и здесь, например]. И вы можете прочитать о Eval в Википедии и в этой замечательной книге.

Вы также можете прочитать книгу Пола Грэма " На Лиспе" (книга совершенно бесплатна), которая довольно быстро обучает основам Common Lisp, а затем знакомится со всеми видами техники программирования с помощью макросов, а позже вы можете попробовать Let Over Lambda (только некоторые главы). Бесплатно).

Около eval может быть интересно прочесть этот вопрос и ответы на него.

Другие вопросы по тегам