在 Common Lisp 中使用没有 body 表达式的 do* 被认为是一种不好的做法吗?
Is using do* without a body expression considered a bad practice in Common Lisp?
我正在尝试通过 Common Lisp:对符号计算的简单介绍 来学习 Common Lisp。此外,我正在使用 SBCL、Emacs 和 Slime。
在第 11 章中,作者介绍了用于迭代的 do*
函数。稍早之前,这本书显示了 do
函数的模板:
(DO ((var1 init1 [update1])
(var2 init2 [update2])
...)
(test action-1 ... action-n)
body)
这本书没有显示do*
的模板。可能是因为它是相同的,尽管 do
和 do*
.
之间存在差异
关于练习 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)))))
这是答案 sheet:
的实现
(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))))
我的实现 returns 结果正确,但风格不同:
(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保留的space中的任何内容表达式。另外,我在局部变量更新中插入了条件表达式。我喜欢我的方法更短这一事实。
我的方法在 Common Lisp 中会被认为是不好的风格或不好的做法吗?可以接受吗?
既然“你不知道你不知道的东西”,我的实施有什么我不知道的缺点吗?
一般来说,这不被认为是不好的做法。但是,您应该避免仅仅因为您不想要一个 do(*) 主体而进行过于复杂的更新和结束测试。
写一个 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)))
我正在尝试通过 Common Lisp:对符号计算的简单介绍 来学习 Common Lisp。此外,我正在使用 SBCL、Emacs 和 Slime。
在第 11 章中,作者介绍了用于迭代的 do*
函数。稍早之前,这本书显示了 do
函数的模板:
(DO ((var1 init1 [update1])
(var2 init2 [update2])
...)
(test action-1 ... action-n)
body)
这本书没有显示do*
的模板。可能是因为它是相同的,尽管 do
和 do*
.
关于练习 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)))))
这是答案 sheet:
的实现(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))))
我的实现 returns 结果正确,但风格不同:
(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保留的space中的任何内容表达式。另外,我在局部变量更新中插入了条件表达式。我喜欢我的方法更短这一事实。
我的方法在 Common Lisp 中会被认为是不好的风格或不好的做法吗?可以接受吗?
既然“你不知道你不知道的东西”,我的实施有什么我不知道的缺点吗?
一般来说,这不被认为是不好的做法。但是,您应该避免仅仅因为您不想要一个 do(*) 主体而进行过于复杂的更新和结束测试。
写一个 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)))