gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:23:59 25 4
gpt4 key购买 nike

让我们看看我的代码

代码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"))

代码 3:奇怪的结果

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

返回"equal"并且没有警告

我使用 guile (GNU Guile) 2.0.11 解释代码.这是 case 的描述来自 gnu 的语法

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

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

关于switch-statement - Scheme 中 `' quote` 和 `' lambda` 的奇怪比较(诡计),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34018798/

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