您不需要引用中的符号CASE
.
实际上你不应该在中引用符号CASE
条款。
See:
CL-USER 31 > (case 'quote
('not-quote 'oops-really-quote)
('quote 'it-is-a-quote))
OOPS-REALLY-QUOTE
以上是使用的意外后果'not-quote
而不是正确的未引用的not-quote
.
下列说法正确的是:
CL-USER 32 > (case 'quote
(not-quote 'oops-really-quote)
(quote 'it-is-a-quote))
IT-IS-A-QUOTE
Common Lisp 中 CASE 的语法
case keyform
{normal-clause}*
[otherwise-clause]
=> result*
normal-clause::= (keys form*)
otherwise-clause::= ({otherwise | t} form*)
clause::= normal-clause | otherwise-clause
keys ::= object | (object*)
正如您所看到的,键要么是单个对象,要么是对象列表。不评估对象。
CASE 子句中的符号不被求值。
(case tile-type
(wall ...)
(door ...))
WALL
and DOOR
纯粹是符号,不作为变量进行计算。
Lisp 读者阅读'foo
as (quote foo)
.
你写了:
(case tile-type
('wall ...)
('door ...))
这相当于:
(case tile-type
((quote wall) ...)
((quote door) ...))
但你不能引用一个符号CASE
。您必须提供符号作为文字常量。
如果你写:
(let ((bar 'foo)
(baz 'foo))
(case bar
(baz :we-have-a-foo-through-baz)
(foo :we-really-have-a-foo)))
这返回:WE-REALLY-HAVE-A-FOO
。因为CASE
使用常量数据,而不是变量。
CASE
接受项目列表。既然你有QUOTE
作为 more than 子句中的符号,编译器显示警告。
正如我所说,不可能报价,因为这些物品没有经过评估。
As for CASE
接受子句中的项目列表,如下所示:
(case tile-type
((door wall) ...)
((floor window painting) ...))
For the WALL
符号,您需要在创建对象时确保它位于正确的包中。
最好使用关键字符号,例如:wall
。这样您就不需要导出它,并且不会混淆该符号位于哪个包中。
关于代码的格式:
您有一个项目符号列表,紧随其后的是代码部分。这不会按照您的预期呈现。我在代码之前添加了文本“代码:”。然后渲染就按预期工作了。