Functional programming 简单Lisp案例陈述问题-与nil比较的问题

Functional programming 简单Lisp案例陈述问题-与nil比较的问题,functional-programming,lisp,case-statement,Functional Programming,Lisp,Case Statement,我试图使用case语句使一些代码更具可读性。它似乎作为一系列if语句工作,但出于某种原因,case语句始终接受与nil的比较,即使它不是真的。有人能澄清为什么会发生这种行为吗 例如: > (case 'a (nil nil) (otherwise 'b)) NIL > (case 'a ('a 'b) (otherwise

我试图使用case语句使一些代码更具可读性。它似乎作为一系列if语句工作,但出于某种原因,case语句始终接受与nil的比较,即使它不是真的。有人能澄清为什么会发生这种行为吗

例如:

> (case 'a            
    (nil nil)         
    (otherwise 'b))   
NIL                   
> (case 'a            
    ('a 'b)           
    (otherwise nil))  
B                       
在上面的示例中,第一个实例返回nil,即使“a”显然不是nil。尝试对if语句执行与我预期的相同的操作:

> (if (eq 'a nil) nil 'b)    
B                            
> (if (eq 'a 'a) 'b nil)     
B                            
我假设我不理解案例陈述中的某些行为。任何帮助都将不胜感激

编辑: 我只是想澄清一下,我知道“a”不会被评估。我只是模拟了这个例子来创建一个场景,在这个场景中,case语句的目标绝对不是nil

我正在使用xlisp plus,但我将尝试一个真正的clisp安装,看看它是否有不同的行为

编辑(再编辑一次):
安装了CLISP,在那里工作正常。不值得费心研究xlisp的不同之处。谢谢大家的理智检查。

我认为这取决于您的LISP版本。 我在Mac上使用了LispWorks,结果如下:

CL-USER 2 : 1 > (case 'a            
    (nil nil)         
    (otherwise 'b))   
B
与SBCL相同:

CL-USER> (case 'a
           (nil nil)
           (otherwise 'b))
B
也就是说,
'a
是一个符号,因此永远不能是
nil
表单中的值是隐式引用的文本列表,因此:

(case 'a
  ((a) 'b)
  (otherwise nil))
这就是你想要的
否则
应该会起作用(正如其他人所说)--请尝试
t

顺便说一句,当您使用
'a
时,读卡器将其读取为
(quote a)
,这意味着当值为
quote
时,它也会选择它,例如:

(case 'quote
  ('a 'b)
  (otherwise nil))

案例中的每个关键规范可以是文本列表或单个原子。但是,因为它是文本
NIL
还是空列表是不明确的。改用
NIL
列表:

> (case 'a
    ((nil) nil)         
    (otherwise 'b))
B
> (case nil
    ((nil) nil)         
    (otherwise 'b))
NIL

Common Lisp希望要测试的项目是一个原子或原子列表。测试还包括函数EQL

(case 'a
  (a 'b)    ; EQL a
  (otherwise 'foo))

(case 'a
  ((a b c) 'foo)   ; EQL to one of a, b or c
  (otherwise 'bar))
该报价仅适用于意外情况下的工程。不要使用它:

; don't use this:
(case 'a
  ('a 'foo)    ; <- bad!  , EQL to QUOTE or A
  (otherwise 'bar))
;不要使用此选项:
(案例a)

('a'foo);这很奇怪。我刚刚在GNU Common Lisp 2.6.7中尝试了您的第一个大小写表达式,它的计算结果(正如预期的那样)为B。“xlisp”是一个重要的信息,来自:“xlisp 3.0是Lisp Scheme方言的超集”在令人印象深刻的无用性展示中,xlisp甚至在格式化问题的方法上都失败了。xlisp不是一种常见的Lisp方言。我猜总是有
COND
;)
; don't use this:
(case 'a
  ((quote a) 'foo)   ; <- bad! ,  EQL to QUOTE or A
  (otherwise 'bar))