2

让我们看看我的代码

代码1:

(eqv? 'lambda 'quote)

返回#f

代码2:

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

返回"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"))

Code3:奇怪的结果

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

返回"equal"并且没有警告

我使用guile (GNU Guile) 2.0.11. 这是来自gnucase的语法描述

使用 eqv? 将此评估的结果与所有数据进行比较?

4

1 回答 1

6

'<something>列表缩写。在 Scheme 中,case 形式应该是一个列表(在某些 Lisps 中,例如 Common Lisp,它也可以是单个非列表元素,表示该元素的列表),以便您可以这样做,例如: (quote <something>)

(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 lambda),大小写匹配,并且您得到“相等”。这个故事的寓意是:“不要引用案例以防万一。” 也就是说,您应该这样做:

(case 'quote
  ((lambda) "equal"))
于 2015-12-01T13:39:48.790 回答