Switch statement 对'的奇怪比较;引用`和`';lambda`in方案(guile)

Switch statement 对'的奇怪比较;引用`和`';lambda`in方案(guile),switch-statement,scheme,quote,guile,Switch Statement,Scheme,Quote,Guile,让我看看我的代码 代码1: (eqv? 'lambda 'quote) 返回#f 代码2: (case 'lambda ('quote "equal") (else "not equal")) 返回“不相等”,但生成警告:17:0:警告:在case表达式(case(quote lambda)((quote)“equal”)的第条((quote)“equal”)中重复数据引用(case(quote lambda)((quote)“equal”)(否则为“notequal”) 代码3:奇怪的结果

让我看看我的代码

代码1:

(eqv? 'lambda 'quote)
返回
#f

代码2:

(case 'lambda ('quote "equal") (else "not equal"))
返回“不相等”,但生成警告:17:0:警告:在case表达式(case(quote lambda)((quote)“equal”)的第条((quote)“equal”)中重复数据引用(case(quote lambda)((quote)“equal”)(否则为“notequal”)

代码3:奇怪的结果

 (case 'quote ('lambda "equal"))
返回
“相等”
且无警告

我使用
guile(GNU-guile)2.0.11
解释代码。下面是对

使用eqv?将评估结果与所有基准进行比较

是列表
(引号)
的缩写。在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)中,因此大小写匹配,得到“相等”。这个故事的寓意是:“不要引用案例以防万一。”也就是说,你应该做到:

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

太棒了。谢谢!在方案中,“单一基准”版本无效;条款必须始终包含一系列基准。此外,这些基准总是使用
eqv?
进行比较,因此字符串和非空列表永远不会(可靠地)匹配。@ChrisJester Young好球!在CommonLisp中,“keys”部分是一个列表指示符:一个键列表,或者一个只指定该键列表的键。我已将我的答案更新为以方案为中心。酷!您还应该删除
(lambda“equal”)
案例,或者只将其标记为CL。@ChrisJester Young哦,错过了那一个!现在修好了。