如何解决简单的Lisp案例陈述问题-与nil相比的问题
| 我正在尝试使用case语句使某些代码更具可读性。它似乎可以作为一系列的if语句工作,但是由于某种原因,case语句始终接受与nil的比较,即使它不是真的。有人可以澄清为什么会发生这种现象吗? 例:> (case \'a
(nil nil)
(otherwise \'b))
NIL
> (case \'a
(\'a \'b)
(otherwise nil))
B
在上面的示例中,即使\'a显然不是nil,第一个实例也返回nil。尝试对if语句执行与预期相同的操作:
> (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))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。