我在实现一个小型 Lisp 解释器,这使我发现了 case
实现中的这个 bug。
(case "s"
'quote "quote"
"default")
;; Syntax error macroexpanding case at (org:localhost:56082(clj)*:131:16).
;; Duplicate case test constant: quote
我认为这可能是一个好的 workaround。
(case 'quote
(symbol "quote") "quote"
"default")
;; => "default"
这不行,返回 "default"。
奇怪的是,尽管 (symbol quote)
将是无效的,因为 quote
未绑定,但 THIS 通过返回 "quote"
"工作"了。
(case 'quote
(symbol quote) "quote"
"default")
;; => "quote"
非常奇怪。看看这个。让我们尝试一个 'face
的情况。它将返回什么?
(case 'quote
'face "face"
"default")
;; => "face"
它与 'quote
匹配!
实际上,所有被引用的东西都会匹配。
(case 'quote
(quote 123) "123"
"default")
;; => "123"
希望这足够让了解 case
宏展开的人理解。
干杯!