在计划中是否可以执行以下操作?
(define (foo a b c d e)
(let ((recurse (foo a b c (bar d) e))
(if (= d e)
#f
(recurse))))
我有一个函数,该函数带有一组较长的参数和一些递归调用它的条件,并且它很难看,我希望可以简化它。
我已经尝试了几种不同的方法,但是我遇到了无限循环(我想让let急切地求值),或者我得到了糟糕的let形式错误。
答案 0 :(得分:3)
您需要一个重击:
(define (foo a b c d e)
(let ((recurse (lambda () (foo a b c (bar d) e))))
(if (= d e)
#f
(recurse))))
然后,如果某些(但不是全部)参数更改,则允许您添加参数。
答案 1 :(得分:0)
由于大多数参数不变,因此您应该考虑使用命名的let
:
(define (foo a b c d e)
(let recurse ((d d))
(if (= d e)
#f
(recurse (cdr d)))))
这基本上与:
(define (foo a b c d e)
(define (recurse d)
(if (= d e)
#f
(recurse (cdr d))))
// start recursion
(recurse d))
所有其他变量将通过闭包提供。