我在实现一个小的 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
是未绑定的,但是这个快捷键 "work" 并返回 "quote"
。
(case 'quote
(symbol quote) "quote"
"default")
;; => "quote"
非常奇怪。看看这个。让我们尝试一个 'face
的例子。它会返回什么?
(case 'quote
'face "face"
"default")
;; => "face"
它会匹配 'quote
!
实际上,任何被引用的内容都会匹配。
(case 'quote
(quote 123) "123"
"default")
;; => "123"
希望这对于熟悉 case
宏展开的人来说,足以理解。
祝您一切顺利!