這不是直接回答你的問題,但我們可以使用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