LISP:将变量/符号传递给函数而不进行评估

时间:2013-05-05 04:52:45

标签: variables lisp

我有一个函数和两个看起来像这样的变量:

 (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

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

2 个答案:

答案 0 :(得分:3)

这是不可能的 - lisp是eager

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

(myFunc 'A 'B)
==> NIL

或使用宏。

答案 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))

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