Почему полезно рассматривать код как данные в 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
может быть интересно прочесть этот вопрос и ответы на него.