Binding Lisp中的哪个函数允许您比较变量名而不是它所包含的内容?

Binding Lisp中的哪个函数允许您比较变量名而不是它所包含的内容?,binding,lisp,common-lisp,Binding,Lisp,Common Lisp,注意:第一次使用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) 我试着搜索,但什么也找不到。如果需要更好的解释,请告诉我,但我将信息遗漏了,因

注意:第一次使用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)

我试着搜索,但什么也找不到。如果需要更好的解释,请告诉我,但我将信息遗漏了,因为这是一个家庭作业,我不想要答案和关于如何解决我的问题的提示。谢谢。

在标题中,您说要比较符号(您称之为变量名)


这就是你的意思吗?

你可以将符号与
eq
进行比较

您的函数类似于
(defun evalexp(表达式绑定)| | | | |)
,其中
注释部分(
| | |…|#
)将包含您的代码。它必须遍历
表达式
树,对于找到的每个符号,检查
绑定
中是否存在该符号的绑定,在这种情况下用值替换该符号。

实际上,eq的实现取决于它的特殊性,不是吗?:

其效果是,如果eq是字符或数字,即使它的两个参数都是“同一事物”,Common Lisp也不能保证eq为真。 (来自hyperspec)

因此,如果你引用相关的参数,eq应该可以工作,但我认为你可以编写一个小的宏来做你想做的事情,如果你想的话,不需要手动引用:

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

我认为是有效的。

是的,但这样做不会比较其中的内容吗?事实上,你能比较变量名吗?是的,你能比较lisp中的符号。因为问题是关于同一个包中的符号,这是无关的。
(defmacro es (x y)
          `(eq (quote ,x) (quote ,y)))