我有一个函数和两个变量,看起来像:
(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
任何帮助都将非常感激。谢谢!
这是不可能的- lisp很着急。
你必须传递变量名(引用它们):
(myFunc 'A 'B)
==> NIL
比较变量名是否相等是很奇怪的。=)我找不到它在哪里有用,除了,也许在运行时生成和评估的代码。但是最好在代码生成器中修复一些东西。或者我只是不明白这个问题。
当
时函数应该返回什么?(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))
但是我还是不明白这个的意思