我有一个函数和两个看起来像这样的变量:
(setq A '(A B))
(setq B '(A B))
(defun myFunc (var1 var2)
(if (equal var1 var2)
'TRUE
'FALSE))
>>> (myFunc A B)
我的问题是我希望Lisp从字面上比较变量NAMES。所以在上面的函数中,我希望它评估为FALSE,因为A!= B,即使它们的“内容”是相同的。问题在于,当传递变量时,它们似乎会立即被评估,所以当我们到达条件时,它们的内容将被检查是否等效。
我在apply
上读了一些看似有帮助的内容,但我似乎无法理解它是如何使用的。 http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node81.html
非常感谢任何帮助。谢谢!
答案 0 :(得分:3)
答案 1 :(得分:1)
这是非常奇怪的希望比较变量名称的相等性。 =)我找不到它有用的地方,除了可能在运行时生成和评估的代码中。但是最好在代码生成器中修复一些东西。或者我无法理解这个问题。
时你的功能应该返回什么
(setf *somelist* '(1 2))
(setf var1 *somelist*)
(setf var2 *somelist*)
(myfunc var1 var2)
如果这应该评估为t
和
(setf var1 '(1 2))
(setf var2 '(1 2))
(myfunc var1 var2)
这应该评估为nil
然后您可能想要使用其他比较函数,而不是equal
。例如,您可以查看eq
。
或者如果你真的需要这样做,你可以写一个宏
(defmacro names-equal (name1 name2)
(if (equal name1 name2) t nil))
但我仍然无法理解这一点。