【发布时间】:2020-01-09 10:34:51
【问题描述】:
我正在努力学习普通的 lisp。我熟悉尾递归,但我不熟悉以调用者不必初始化累加器变量的方式包装尾递归函数的惯用方式。这是一个例子:
(defun add-em (n s)
(if (eql n 0)
s
(add-em (- n 1) (+ s n))
)
)
假设我想包装这个函数,这样用户只需要管理输入n,而不需要完整的函数调用(add-em <number> 0)。在其他语言中,比如 scala,我会定义一个内部函数,然后在外部函数的末尾,我会调用尾递归内部函数来运行算法。
在普通的 lisp 中,我可以在函数中定义一个 lambda 并使用它,但它看起来有点难看。我认为可能有一种更惯用的方式来做到这一点,但谷歌搜索并没有真正给我任何结果。
除了完全拆分函数之外,还有更惯用的方法吗?或者这是最好的方法?一个例子:
(defun add-em-inner (num sum)
(if (eql num 0)
sum
(add-em-inner (- num 1) (+ num sum))
)
)
(defun add-em (n)
(add-em-inner n 0)
)
【问题讨论】: