Какая функция в Лиспе позволяет сравнивать имена переменных, а не то, что они содержат? - PullRequest
1 голос
/ 06 марта 2012

Примечание. При первом использовании lisp *

у меня есть домашнее задание, и мы должны связать выражения с 0 или 1. Пример:

(defun orexp (a b) (list 'or a b))

(setq p3 (orexp 1 'a)) ;which equals (or 1 a)

Скажите, что я хотелсоздать функцию для их оценки, связав их и упростив, но игнорируя упрощение, как я могу связать их, выполнив что-то вроде этого:

(evalexp p3 '((a 0)))

и в итоге:

(or 1 0)

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

Ответы [ 3 ]

2 голосов
/ 06 марта 2012

В заголовке вы говорите, что хотите сравнить символы (то, что вы называете именами переменных).

> (eq 'a 'a)
true
> (eq 'a 'b)
false

Это то, что вы имеете в виду?

1 голос
/ 06 марта 2012

Вы можете сравнить символы с eq.

Ваша функция похожа на (defun evalexp (expression bindings) #| ... |#), где закомментированная часть (#| ... |#) будет содержать ваш код.Ему придется пройтись по дереву expression, и для каждого найденного символа проверить, существует ли привязка этого символа в bindings, заменив символ значением в таком случае.

0 голосов
/ 12 марта 2012

На самом деле, eq зависит от реализации в зависимости от его специфичности, не так ли ?:

В результате Common Lisp не гарантирует, что eq верен, даже если оба его аргумента являются ``то же самое ", если эта вещь представляет собой символ или число.(из гиперспека)

Таким образом, eq должен работать, если вы цитируете аргументы, но я думаю, что вы могли бы написать небольшой маленький макрос, чтобы делать то, что вы хотите, без кавычек, если хотите:

(defmacro es (x y)
          `(eq (quote ,x) (quote ,y)))

работает, я думаю.

...