Скажите в lisp можно создать программу которая сама себя модифицирует?
Формулировка задачи:
Решение задачи: «Скажите в lisp можно создать программу которая сама себя модифицирует?»
(define-syntax foo (syntax-rules () ((_) (datum->syntax #f (read))))) > (eval (foo)) ((lambda (x) (* x x)) 2) 4 >
Объяснение кода листинга программы
В представленном коде на языке Lisp определён синтаксический макрос foo, который при вызове считывает некоторое количество пробелов, а затем вызывает функцию datum->syntax с аргументом #f и результатом вызова функции read.
То есть при каждом вызове макроса foo считывается строка, и в этой строке ищется лексема (слово или символ), которая соответствует синтаксическому контексту, заданному в определении макроса. И затем в этом месте в синтаксическом выражении вставляется результат вызова функции datum->syntax с аргументом #f и результатом вызова функции read.
То есть если вызвать макрос foo без аргументов, он считывает строку, в которой первым встречает пробел, и в этом месте в синтаксическом выражении подставляет результат вызова функции datum->syntax с аргументом #f и результатом вызова функции read.
Затем вызывается функция eval с аргументом (lambda (x) (* x x)) 2, которая считывает строку с результатом вызова функции read, и в этом месте в синтаксическом выражении подставляет результат вызова функции datum->syntax с аргументом #f и результатом вызова функции read.
То есть результат вызова функции eval — это результат вызова функции read, в котором первым встречает пробел, и в этом месте в синтаксическом выражении подставляет результат вызова функции datum->syntax с аргументом #f и результатом вызова функции read.
Затем вызывается функция read, которая считывает строку, и в этом месте в синтаксическом выражении подставляет результат вызова функции datum->syntax с аргументом #f и результатом вызова функции read.
И в результате вызова функции read результатом является число 4.