gpt4 book ai didi

emacs - 在Elisp中的lambda递归

转载 作者:行者123 更新时间:2023-12-02 06:19:50 27 4
gpt4 key购买 nike

我有以下Python代码:

def sum_fibonacci():
'''Project Euler: 2
Sum of even-valued terms of Fibonacci sequence < 4 mil
'''
def i(a, b, acc):
if a >= 4000000: return acc
if a % 2 == 0:
return i(a + b, a, acc + a)
else: return i(a + b, a, acc)
return i(2, 1, 0)

我想将其翻译为Emacs Lisp。在 Higher-order functions in Elisp中,我被告知不要在 defun中使用 defun,因为它全局启用了该功能,所以我改为编写了lambda。但是我需要使lambda递归调用自己。

我的代码是:
(defun sum-fibonacci ()
(let ((i
(lambda (a b acc)
(cond ((>= a 4000000) acc)
((evenp a) (funcall i (+ a b) a (+ a acc)))
(t (funcall i (+ a b) a acc))))))
(funcall i 2 1 0)))

但是函数 i在被分配给 let之前被调用,并且我得到一个错误- *** Eval error *** Symbol's value as variable is void: i
如何在Elisp中的lambda中进行递归?

最佳答案

Recursing in a lambda function我用labels重写它:

(defun sum-fibonacci ()
(labels ((i (a b acc)
(cond ((>= a 4000000) acc)
((evenp a) (i (+ a b) a (+ a acc)))
(t (i (+ a b) a acc)))))
(i 2 1 0)))

关于emacs - 在Elisp中的lambda递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13356001/

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