Scheme 中 `'quote` 和 `'lambda` 的奇怪比较(诡计)

Strange comparison of `'quote` and `'lambda` in Scheme (guile)

让我们看看我的代码

代码 1:

(eqv? 'lambda 'quote)

return #f

代码2:

(case 'lambda ('quote "equal") (else "not equal"))

return "not equal" 但生成警告 ;;; <stdin>:17:0: warning: duplicate datum quote in clause ((quote quote) "equal") of case expression (case (quote lambda) ((quote quote) "equal") (else "not equal"))

代码 3:奇怪的结果

 (case 'quote ('lambda "equal"))

return "equal" 并且没有警告

我使用 guile (GNU Guile) 2.0.11 解释代码。这是 gnu

中对 case 语法的描述

The the result of this evaluation is compared against all datums using eqv?

'<something>列表 (quote <something>)缩写。在 Scheme 中,case 形式应该是一个列表(在一些 Lisp 中,例如 Common Lisp,它也可以是一个单独的非列表元素,代表只是那个元素的列表),这样你就可以这样做,例如:

(case n
  ((0) 'zero)                 ; in Common Lisp, could also be (0 'zero)
  ((1 2 3) 'one-two-or-three)
  ((4 5) 'four-or-five))

当你这样做时:

(case some-symbol
   ('quote 'it-was-quote))

你在做

(case some-symbol
  ((quote quote) 'it-was-quote))

所以你提供了一个列表,它有一个重复的元素。这没有什么错误,但它通常是出乎意料的,因此您会收到警告。

根据这个推理

(case 'quote ('lambda "equal"))

相同
(case 'quote ((quote lambda) "equal"))

并且,由于符号 quote 在列表 (quote lambda) 中,大小写匹配,您得到 "equal".这个故事的寓意是:"don't quote the cases in case." 也就是说,你应该做的是:

(case 'quote
  ((lambda) "equal"))