这不是直接回答你的问题,但我们可以使用lisp来查看它在做什么。
如果在CLHS页面查找case
我们可以看到它是一个宏观的,这意味着我们可以macroexpand它,看它变成什么成
因此,让我们第一个例子
(case n
(23 'foo)
(42 'bar)
(otherwise 'something-else))
这种扩展到
(LET ((#:G1246 N))
(COND ((EQL #:G1246 '23) NIL 'FOO)
((EQL #:G1246 '42) NIL 'BAR)
(T NIL 'SOMETHING-ELSE)))
的#:G1246
是我们能想到的一个象征保证通过口齿不清唯一一个gensym ..我会只是将其重命名为tmp
现在
(let ((tmp n))
(cond ((eql tmp '23) nil 'foo)
((eql tmp '42) nil 'bar)
(t nil 'something-else)))
而且cond
是一个宏观的..让我们来看看如何扩展(我已经简化它有点像上文)
(let ((tmp n))
(if (eql tmp '23)
'foo
(if (eql tmp '42)
'bar
'something-else)))
现在我们可以看到所有的逻辑
现在,让我们展开下一个
(case n
((23 42) 'foo-or-bar)
(otherwise 'something-else))
成为s
(let ((tmp n))
(if (or (eql tmp '23) (eql tmp '42))
'foo-or-bar
'something-else))
Macroexpand是该死的有用的。希望这可以帮助
你为什么不尝试它?转到lisp提示符并输入内容,如'(let((n 3))(case n((2 3)'foo)(4'bar)))'。但是,是的,这是正确的。 – lurker 2015-04-04 15:32:45