我注意到这个函数rec在Common Lisp代码中多次出现,但是我没有找到它实际上在做什么的引用.任何人都可以向我解释它是什么?例如,它出现在另一个问题的一些代码中,如何将平面列表转换为嵌套的树状结构?:
(defun mimicry (source pattern)
(labels ((rec (pattern)
(mapcar (lambda (x)
(if (atom x)
(pop source)
(rec x)))
pattern)))
(rec pattern)))
Run Code Online (Sandbox Code Playgroud) 要在 Lisp 中折叠平面列表,可以使用reduce:
* (reduce #'+ '(1 2 3 4 5))
15
Run Code Online (Sandbox Code Playgroud)
但是,如果我有一个任意复杂的树,并且我想对每个元素应用一个函数,该怎么办?那么折叠'(1 (2) (3 (4) 5))仍然会给出15?我尝试使用reduce,但我必须提供一个自定义函数,这有点违背了目的:
(defun tree+ (a b)
(cond ((null b) 0)
((atom b) (+ a b))
(t (+ (tree+ a (car b))
(tree+ 0 (cdr b))))))
(reduce #'tree+ '(1 (2) (3 (4) 5)) :initial-value 0) ; returns 15
Run Code Online (Sandbox Code Playgroud)
当然,我可以先展平列表,但这reduce是一个通用函数,有时您必须保留原始序列的结构和顺序。例如,map和filter可以用 来实现reduce。如果我想my-map基于编写 的实现reduce,那么:
(my-map '1+ '(1 (2 (3) …Run Code Online (Sandbox Code Playgroud)