简单的Lisp案例陈述问题-与nil相比的问题

问题描述

| 我正在尝试使用case语句使某些代码更具可读性。它似乎可以作为一系列的if语句工作,但是由于某种原因,case语句始终接受与nil的比较,即使它不是真的。有人可以澄清为什么会发生这种现象吗? 例: @H_502_1@> (case \'a (nil nil) (otherwise \'b)) NIL > (case \'a (\'a \'b) (otherwise nil)) B 在上面的示例中,即使\'a显然不是nil,第一个实例也返回nil。尝试对if语句执行与预期相同的操作: @H_502_1@> (if (eq \'a nil) nil \'b) B > (if (eq \'a \'a) \'b nil) B 我假设我不理解有关case语句的某些行为。任何帮助,将不胜感激。 编辑: 只是为了澄清,我知道\'a \不会被评估。我只是模拟了这个示例,以创建一种情况,其中case语句的目标绝对不是nil。 我正在使用xlisp-plus,但我将尝试进行真正的clisp安装,并查看其行为是否有所不同。 编辑(再编辑一次): 安装了CLISP,在那可以正常工作。调查xlisp为何与众不同的麻烦真的不值得。谢谢大家的检查。     

解决方法

我认为这取决于您的LISP版本。 我在Mac上安装了LispWorks,结果是:
CL-USER 2 : 1 > (case \'a            
    (nil nil)         
    (otherwise \'b))   
B
    ,“ 3”中的每个关键规范都可以是文字列表或单个原子。但是,CLtL表示原子不得为
NIL
,因为它对于字面意义是ѭ4an还是空白列表均不明确。请使用
NIL
列表:
> (case \'a
    ((nil) nil)         
    (otherwise \'b))
B
> (case nil
    ((nil) nil)         
    (otherwise \'b))
NIL
    ,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))
    ,与SBCL相同:
CL-USER> (case \'a
           (nil nil)
           (otherwise \'b))
B
就是说,“ 12”是一个符号,因此永远不能是“ 13”。     ,
case
形式的值是文字的隐式引用列表,因此:
(case \'a
  ((a) \'b)
  (otherwise nil))
是你想要的。
otherwise
应该可以工作(正如其他人所说的)-尝试try17ѭ。 顺便说一句,当您使用
\'a
时,阅读器会将其读取为
(quote a)
,这意味着当值是
quote
时也会选择它,例如:
(case \'quote
  (\'a \'b)
  (otherwise nil))