gpt4 book ai didi

lisp - 对于 case,这些表示 case 的方法中哪种最好?

转载 作者:太空宇宙 更新时间:2023-11-03 18:37:58 25 4
gpt4 key购买 nike

这些都有效:

(defun testcaseexpr (thecase)
(case thecase
('foo (format t "matched foo"))
(bar (format t "matched bar"))
((funk) (format t "matched funky"))))

这三种表达方式中,哪一种被认为是惯用的方式?也许作为一个方面,为什么它们都有效,而它们显然不是相同的语法。事实上,在其他情况下,它们具有完全不同的语义。列表 (funk) 当然与引用的原子 'foo 不同。然而,只要传入单词 foo barfunk 都一样。

最佳答案

首先,请注意这里实际上只有两个案例。 'foo 被读者扩展为 (quote foo),所以你的代码等同于

(defun testcaseexpr (thecase)
(case thecase
((quote foo) (format t "matched foo"))
(bar (format t "matched bar"))
((funk) (format t "matched funky"))))

其中第一种情况和第三种情况结构相同;子句的 keys 部分是对象列表。

也许这个问题是题外话,因为它要求的是“最佳”,而这可能主要是基于意见。我同意 wvxvw's answer 中提出的观点,但我倾向于几乎完全使用您在第三种情况下展示的风格。我有几个原因:

这是最通用的形式。

这是最通用的形式。在 case 的文档中,我们在 normal-clause::= (keys form*) 中读到 keys 是列表的指示符键。这意味着像 (2 (print 'two)) 这样的子句等同于 ((2) (print 'two))。使用列表而不是非列表永远不会丢失任何东西,但是如果您有一些子句包含多个对象,一些子句包含单个对象,那么所有这些子句的语法都是一致的。例如,你可以有

(case operator
((and or) ...)
((if iff) ...)
((not) ...))

更难搞砸。

这使得混淆 totherwise 的特殊情况变得更加困难。该文档说明了关于的内容(添加了强调):

keys—a designator for a list of objects. In the case of case, the symbols t and otherwise may not be used as the keys designator. To refer to these symbols by themselves as keys, the designators (t) and (otherwise), respectively, must be used instead.

在实践中,一些实现会让你使用 totherwise 作为 normal-clauses 中的 keys,即使这看起来不应该被允许。例如,在 SBCL 中:

CL-USER> (macroexpand-1 '(case keyform
(otherwise 'a)
(otherwise 'b)))


(LET ((#:G962 KEYFORM))
(DECLARE (IGNORABLE #:G962))
(COND ((EQL #:G962 'OTHERWISE) NIL 'A)
(T NIL 'B)))

使用显式列表可以消除您要执行的操作的任何歧义。尽管 totherwise 被特别调用,keys 是一个列表指示符,这意味着 nil(一个原子和列表)需要一些特殊的考虑。以下代码会生成 a 还是 b? (你能在不测试或检查规范的情况下判断吗?这种情况实际上在示例中突出显示。)

(case nil
(nil 'a)
(otherwise 'b))

它返回b。要返回 a,第一个普通子句必须是 ((nil) 'a)

结论

如果您始终确保 keys 是一个列表,您将:

  1. 最终得到看起来更一致的代码;
  2. 避免极端情况错误(尤其是当您编写扩展为case 的宏时);和
  3. 让你的意图更明确。

关于lisp - 对于 case,这些表示 case 的方法中哪种最好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19977714/

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