конвертация из "в кавычки" - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь написать интерпретатор lisp, используя только примитивные функции lisp. Я писал свой eval, но я не уверен, как я могу определить ', поэтому я не оцениваю символ. Я понимаю, что 'x преобразуется внутренне (цитирует x), я запустил интерпретатор lisp и попробовал следующее:

(defun my-car (x) (car x)) 
(my-car (quote x)) -> QUOTE 
(my-car '(x)) -> QUOTE
(my-car 'x) -> Error: Attempt to take the car of A which is not listp.

Я вижу, что в первых двух примерах машина определяет кавычку как первый элемент и возвращает ее, я не уверена, почему она не делает этого в последнем примере, хотя, по сути, 'x следует преобразовать в (цитата х) затем передал в качестве аргумента мою машину. Мне нужно проверить это для одного из базовых случаев my-eval, чтобы, если кавычка предшествовала атому, я не возвращал его значение. Есть ли способ сделать это, используя только примитивные функции?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Ваш интерпретатор Lisp не ведет себя как Common Lisp. Вы должны получить:

(defun my-car (x) (car x)) 
(my-car (quote x)) -> Error: Attempt to take the car of A which is not listp.
(my-car '(x)) -> X
(my-car 'x) -> Error: Attempt to take the car of A which is not listp.
(my-car (list 'QUOTE 'X)) -> QUOTE
(my-car ''x) -> QUOTE
(my-car (quote 'x)) -> QUOTE
(my-car '(quote x)) -> QUOTE

Шаг за шагом:

Исходный код:

(my-car ''x)

Анализировать:

(my-car (quote (quote x)))

Оценка аргументов

(#<Function MY-CAR> (quote x))

Функция вызова:

X

Это я, потому что машина из списка символа QUOTE и символа X равна QUOTE.

0 голосов
/ 07 ноября 2018

Оценка Lisp происходит поэтапно.

На первом этапе читатель, который преобразует текст (последовательность символов) в формы , т.е. е. списки, символы и буквенные формы (символы, строки, числа, массивы и т. д.).

Читатель также преобразует ' в завернутую форму цитаты вокруг следующей формы (которая может быть списком, символом и т. Д.). 'a равно читается как (quote a), '(a) равно читается как (quote (a)).

Eval тогда нужно только правило, как обрабатывать quote в качестве оператора. Он никогда не видит '.

...