我想我知道发生了什么事。Lisp只使用'
match子句的一部分,'(1 2 3)
并'(41 42 43)
作为键(因为它们都扩展为(Quote
...,从这个角度来看,第三个代码段中的第二个'
= (QUOTE
...是“重复键”(实际上不是)根本没有关键。这只是我的语法错误)。
我认为我的主要问题是我没有正确理解编译器警告。
我不了解case
(或sbcl)的以下行为。
R. Joswig在此SO发布中指出,case
表单的match子句未求值并视为文字。因此,不应该引用match子句。
我不知道这一点,我引用了一个match子句,却忘了引用另一个子句。我不明白的是,为什么当我引用一个match子句时编译器不会抱怨,而如果我同时引用它们都会抱怨。特别:
> (let ((x 42))
(case x
((1 2 3) 'first-branch)
('(41 42 43) 'second-branch))) ; <= second match clause quoted
NIL
=>没有警告。
> (let ((x 42))
(case x
('(1 2 3) 'first-branch) ; <= first match clause quoted
((41 42 43) 'second-branch)))
NIL
=>也没有警告。
> (let ((x 42))
(case x
('(1 2 3) 'first-branch) ; <= both quoted
('(41 42 43) 'second-branch))) ; <=
NIL
=>样式警告:
; caught STYLE-WARNING:
; Duplicate key QUOTE in CASE form, occurring in the first clause:
; ('(1 2 3) 'FIRST-BRANCH), and the second clause:
; ('(41 42 43) 'SECOND-BRANCH).
为什么仅在我引用两个匹配子句时编译器会抱怨,而在我只引用一个匹配子句时却不抱怨呢?
由于case
未评估,因此在quote
两种情况下,代码均等同于:
(let ((x 2 ))
(case x
((QUOTE (1 2 3)) 'first-branch)
((QUOTE (41 42 43)) 'second-branch)))
这意味着您QUOTE
同时使用两种形式的文字,从而导致出现警告消息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句