3

我正在尝试使用 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 不同。谢谢大家的理智检查。

4

5 回答 5

4

a 中的每个关键规范都CASE可以是文字列表或单个原子。但是,CLtL 说原子一定不能是NIL,因为它对于它是文字NIL还是空列表是模棱两可的。改用以下列表NIL

> (case 'a
    ((nil) nil)         
    (otherwise 'b))
B
> (case nil
    ((nil) nil)         
    (otherwise 'b))
NIL
于 2011-05-23T14:15:10.503 回答
2

Common Lisp 期望 CASE 测试的项目是一个原子或原子列表。测试也是功能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))

上面是一样的:

; don't use this:
(case 'a
  ((quote a) 'foo)   ; <- bad! ,  EQL to QUOTE or A
  (otherwise 'bar))
于 2011-05-23T18:09:17.000 回答
1

我认为这取决于您的 LISP 版本。我在 Mac 上有 LispWorks,我的结果是:

CL-USER 2 : 1 > (case 'a            
    (nil nil)         
    (otherwise 'b))   
B
于 2011-05-23T13:59:33.640 回答
1

与 SBCL 相同:

CL-USER> (case 'a
           (nil nil)
           (otherwise 'b))
B

也就是说,'a是一个符号,因此永远不可能nil

于 2011-05-23T14:02:57.437 回答
0

表单中的值case是隐式引用的文字列表,因此:

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

是你想要的。 otherwise应该工作(正如其他人所说) - 尝试t代替。

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

(case 'quote
  ('a 'b)
  (otherwise nil))
于 2011-05-23T14:04:32.283 回答