Binding Lisp中的哪个函数允许您比较变量名而不是它所包含的内容?
注意:第一次使用lisp* 我有一个家庭作业,我们假设用0或1来绑定表达式。例如: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) 我试着搜索,但什么也找不到。如果需要更好的解释,请告诉我,但我将信息遗漏了,因
(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)))