将变量/符号传递给函数而不求值



我有一个函数和两个变量,看起来像:

 (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))

但是我还是不明白这个的意思

最新更新