在Lisp中切换语句

Sag*_*921 2 lisp common-lisp switch-statement

用Lisp中的字符串切换语句.

    (defun switch(value) 
      (case value
        (("XY") (print "XY"))
        (("AB") (print "AB"))
      )
    ) 
Run Code Online (Sandbox Code Playgroud)

我想比较值是"XY"然后打印"XY"或"AB"相同.我试过这段代码,但它给了我零.有人可以告诉我我做错了什么吗?

Syl*_*ter 6

print("XY")看起来更像是Algol(及其所有后代),而不是LISP.要应用print一个将围绕运算符和括号中的参数,如(print "XY")

case碰巧是一个宏,你可以自己测试结果,将引用的代码传递给macroexpand我的实现,我得到:

(let ((value value)) 
  (cond ((eql value '"XY") (print "XY")) 
        ((eql value '"AB") (print "AB"))))
Run Code Online (Sandbox Code Playgroud)

您应该知道eql这只适用于原始数据类型和数字.字符串是序列,因此(eql "XY" "XY") ;==> nil

也许你应该使用别的东西case.例如.使用condifequal.


Sva*_*nte 6

您可以使用alexandria具有可配置switch宏的库:

(switch ("XY" :test 'equal)
  ("XY" "an X and a Y")
  ("AB" "an A and a B"))
Run Code Online (Sandbox Code Playgroud)