我在实现一个小型的 Lisp 解释器,这让我发现了 case
实现中的这个问题。
(case "s"
'quote "quote"
"default")
;; Syntax error macroexpanding case at (org:localhost:56082(clj)*:131:16).
;; Duplicate case test constant: quote
我认为这可能是一个好的解决方案
(case 'quote
(symbol "quote") "quote"
"default")
;; => "default"
但这不起作用,它返回 "default"。
奇怪的是,尽管 (symbol quote)
会是无效的,因为 quote
未绑定,但这次的返回值是 "quote"
,看起来似乎可以工作。
(case 'quote
(symbol quote) "quote"
"default")
;; => "quote"
非常奇怪。看看这个。我们尝试一下 'face
的例子。它会返回什么?
(case 'quote
'face "face"
"default")
;; => "face"
它匹配 'quote
!
实际上,任何被引用的对象都匹配。
(case 'quote
(quote 123) "123"
"default")
;; => "123"
希望这足以让了解 case
宏展开的人明白。
感谢!