在case宏中使用的参数和相等谓词

pet*_*ntr 4 common-lisp

我使用defparameter创建了一些整数类型的全局变量。我在CASE子句中将它们用作键,以匹配在程序中的某个时刻设置为这些全局变量之一的test-key。

据我所知,CASE宏使用EQL(http://clhs.lisp.se/Body/26_glo_s.htm#same),但是我没有找到匹配项:所有内容都被转储到else子句中。下面的代码总结了令人困惑的事情。

  • (defparameter snafu 123)=> SNAFU
  • (让((x snafu))(和(eq x snafu)(eql x snafu)(等于x snafu)))=> T
  • (let(((x snafu))(case x(snafu'是)(t'no)))=>否
  • (让(((x snafu))(cond((eql x snafu)'是)(t'否)))=>是

我不明白为什么我在案例中没有得到YES。

cor*_*ump 5

不评估case子句,而是直接使用它们。这个:

(case x
  (snafu 'yes)
  (t 'no))
Run Code Online (Sandbox Code Playgroud)

等效于:

(if (eql x 'snafu) 'yes 'no)
Run Code Online (Sandbox Code Playgroud)

请注意snafu:之前的引号x是与符号snafu而不是其值进行比较的。