Functional programming 简单Lisp案例陈述问题-与nil比较的问题
我试图使用case语句使一些代码更具可读性。它似乎作为一系列if语句工作,但出于某种原因,case语句始终接受与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 '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))