如何在不使用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)))
)
)
答案 0 :(得分:4)
您的尝试没问题,但通常写成:
...
(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))
...)