0

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

 (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

任何帮助将非常感激。谢谢!

4

2 回答 2

3

这是不可能的——lisp 是急切的。

您必须传递变量名称(引用它们):

(myFunc 'A 'B)
==> NIL

或使用宏。

于 2013-05-05T05:15:18.390 回答
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))

但我仍然无法理解这一点。

于 2013-05-05T08:01:06.163 回答