我正在实现一个小型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
宏展开的人来说足够使其有道理。
再见!