gpt4 book ai didi

common-lisp - 如何处理普通 lisp 中的 `&rest` args

转载 作者:行者123 更新时间:2023-12-04 02:41:22 25 4
gpt4 key购买 nike

我是 common lisp 的新手,当我在函数参数声明中看到 &rest 时,我认为它类似于 *args in ruby .然后我开始编写一个函数 sumit 来做与 + 相同的事情。

(defun sumit (&rest args)
(if (null args)
0
(+ (car args) (sumit (cdr args)))))

但是当我调用 (sumit 1 2 3) 时出现段错误,递归永远不会结束。 (sumit) 虽然有效。

所以我怀疑是 (null args) 部分,但在更改类似 (eql nil args) 或类似内容后不起作用。

那么分解&rest args 的正确方法是什么?检查nil的正确方法是什么?

最佳答案

(sumit (cdr args)) 在单个参数上调用 sumit - 一个列表。您需要使用 apply :

(defun sumit (&rest args)
(if args
(+ (car args) (apply #'sumit (cdr args)))
0))

注意事项:

  1. 此实现不是尾递归的(虽然 ANSI CL 需要尾调用优化,但许多实现确实提供它)。
  2. 看看call-arguments-limitlambda-parameters-limit .
  3. 要对列表的元素求和,可以使用(apply #'+ list-of-numbers),但是,由于上述两个变量, (reduce #'+ list-of-numbers)是一种更好的方法。

关于common-lisp - 如何处理普通 lisp 中的 `&rest` args,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42219300/

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