Lisp:防止递归函数的双重调用

Lisp: Prevent double invocation of recursive function

如何在不使用 set/setq/setf 的情况下防止对 (f (car l)) 的双重递归调用?

(defun f(l)
    (cond
        ((null l) nil)
        ((listp (car l)) (append (f (car l)) (f (cdr l)) (car (f (car l)))))
        (T (list (car l)))
    )
)

你觉得下面的方法能解决问题吗?

(defun f(l)
  (cond
    ((null l) nil)
    ((listp (car l))
        (funcall #'(lambda(ff) (append ff (f (cdr l)) (list (car ff)))) (f (car l))))
    (T (list (car l)))
   )
)

你的尝试没问题,但通常写成:

...
(bar (foo abcde))
...
(baz (foo abcde))
...

->

(let ((r (foo abcde)))
  ...
  (bar r)
  ...
  (baz r)
  ...)

另请注意:

(funcall #'(lambda (foo) ...) bar)

可以用 Common Lisp 写成:

((lambda (foo) ...) bar)

或首选,如前所述,如:

(let ((foo bar))
  ...)