首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在通用Lisp中,使用do*不带身体表达式是否被认为是一种糟糕的做法?

在通用Lisp中,使用do*不带身体表达式是否被认为是一种糟糕的做法?
EN

Stack Overflow用户
提问于 2021-07-17 22:19:23
回答 2查看 67关注 0票数 2

我正试着用“通用Lisp:符号计算的温柔入门”一书来学习Common。此外,我正在使用SBCL,Emacs,和泥。

第11章给出了迭代的do*函数。稍早之前,这本书展示了do函数的模板:

代码语言:javascript
运行
复制
(DO ((var1 init1 [update1])
     (var2 init2 [update2])
     ...)
    (test action-1 ... action-n)
 body)

这本书做了,而不是,展示了do*的模板。可能是因为它将是相同的,尽管dodo*之间存在差异。

在练习11.11上,这本书要求:

代码语言:javascript
运行
复制
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)))))

这是答案表中的实现:

代码语言:javascript
运行
复制
(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))))

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

代码语言:javascript
运行
复制
(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表达式保留的空间中没有使用任何东西。另外,我在局部变量update中插入了条件表达式。我喜欢我的方法更短的事实。

在通用Lisp中,我的方法会被认为是糟糕的风格还是糟糕的实践呢?这是否可以接受?

既然“你不知道你不知道什么”,我的实现是否有我不知道的缺点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-18 13:59:27

在没有body的情况下编写do*循环没有什么错。以下是另一种版本:

代码语言:javascript
运行
复制
(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)))
票数 4
EN

Stack Overflow用户

发布于 2021-07-18 06:43:15

一般来说,这并不被认为是不好的做法。然而,您应该避免过于复杂的更新和结束测试仅仅是因为您不想要一个do(*)主体。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68424660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档