gpt4 book ai didi

common-lisp - 在 CASE 中引用 match 子句

转载 作者:行者123 更新时间:2023-12-03 07:45:06 26 4
gpt4 key购买 nike

更新

我想我明白发生了什么事。 Lisp 仅将匹配子句 '(1 2 3)'(41 42 43)' 部分视为键(因为它们两者都扩展为 (Quote... 从这个角度来看,第三个代码片段中的第二个 ' = (QUOTE... 是一个 "重复的键”(事实上它根本不是一个键。这只是我的一个语法错误)。

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

原帖

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

this SO 发布 R. Joswig 指出 case 形式的 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).

为什么只有当我引用两个匹配子句时编译器才会提示,而如果我只引用一个则编译器不会提示?

最佳答案

澄清一下:这里的引号只是另一个符号,没有任何特定含义。 Common Lisp 期望 case 表达式的子句开头是一个常量原子,如 foo 或常量原子列表,如 (foo bar baz).另请注意,Lisp 使用 eql 作为比较 - 因此,在数字和字符的情况下,它会比较身份或值,但不会比较内容。

此示例表明,quote 只是 case 子句中的另一个符号:

CL-USER> (case 2
((quote foo) 'foo)
((quote bar) 'bar))
WARNING: Duplicate key QUOTE in CASE form, occurring in the first clause:
('FOO 'FOO), and the second clause:
('BAR 'BAR).
NIL

如果我们写 baz 而不是 quote,我们会得到相同的警告:

CL-USER> (case 2
((baz foo) 'foo)
((baz bar) 'bar))
WARNING: Duplicate key BAZ in CASE form, occurring in the first clause:
((BAZ FOO) 'FOO), and the second clause:
((BAZ BAR) 'BAR).
NIL

关于common-lisp - 在 CASE 中引用 match 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43210454/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com