在CASE中引用匹配子句

坦率

更新资料

我想我知道发生了什么事。Lisp只使用'match子句一部分,'(1 2 3)'(41 42 43)作为键(因为它们都扩展为(Quote...,从这个角度来看,第三个代码段中的第二个'= (QUOTE...是“重复键”(实际上不是)根本没有关键。这只是我的语法错误)。

我认为我的主要问题是我没有正确理解编译器警告。

原始帖子

我不了解case(或sbcl)的以下行为

R. JoswigSO发布中指出,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).

为什么仅在我引用两个匹配子句时编译器会抱怨,而在我只引用一个匹配子句时却不抱怨呢?

shizhz

由于case未评估,因此在quote两种情况下,代码均等同于:

(let ((x 2 ))
 (case x
   ((QUOTE (1 2 3)) 'first-branch)           
   ((QUOTE (41 42 43)) 'second-branch)))

这意味着您QUOTE同时使用两种形式的文字,从而导致出现警告消息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章