gpt4 book ai didi

iteration - 在 Common Lisp 中使用没有 body 表达的 do* 被认为是一种不好的做法吗?

转载 作者:行者123 更新时间:2023-12-05 09:04:34 26 4
gpt4 key购买 nike

我正在尝试通过Common Lisp:对符号计算的温和介绍这本书来学习 Common Lisp。此外,我正在使用 SBCL、Emacs 和 Slime。

在第 11 章中,作者介绍了用于迭代的 do* 函数。稍早之前,这本书展示了一个do函数的模板:

(DO ((var1 init1 [update1])
(var2 init2 [update2])
...)
(test action-1 ... action-n)
body)

这本书没有显示do*的模板。可能是因为它是相同的,尽管 dodo* 之间存在差异。

在练习 11.11 中,本书要求:

11.11 Rewrite the following function to use DO* instead of DOLIST.

(defun find-largest (list-of-numbers)
(let ((largest (first list-of-numbers)))
(dolist (element (rest list-of-numbers)
largest)
(when (> element largest)
(setf largest element)))))

这是答题卡中的实现:

(defun do*-find-largest-answer-sheet (list-of-numbers)
(do* ((largest (first list-of-numbers))
(z (rest list-of-numbers) (rest z))
(element (first z) (first z)))
((null z) largest)
(when (> element largest)
(setf largest element))))

我的实现返回正确的结果,但它有不同的风格:

(defun do*-find-largest (list-of-numbers)
(do* ((x list-of-numbers (rest x))
(e (first x) (first x))
(largest (car list-of-numbers) (if (> e largest) e largest)))
((null (rest x)) (return largest))))

如您所见,与书中的答案不同,我在通常为 body 表达保留的空间中使用任何内容。另外,我在局部变量更新中插入了条件表达式。我喜欢我的方法更短这一事实。

我的方法在 Common Lisp 中会被认为是不好的风格或不好的做法吗?可以接受吗?

既然“你不知道你不知道的东西”,我的实现是否有任何我不知道的缺点?

最佳答案

编写一个没有主体的do* 循环并没有错。这是一个替代版本:

(defun do*-find-largest (list-of-numbers)
(do* ((x list-of-numbers (cdr x))
(largest (car x) (max largest (car x))))
((null (cdr x)) largest)))

关于iteration - 在 Common Lisp 中使用没有 body 表达的 do* 被认为是一种不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68424660/

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