相关疑难解决方法(0)

在带有标签的Common Lisp源中调用rec的未记录函数?

我注意到这个函数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)

common-lisp

5
推荐指数
1
解决办法
529
查看次数

在 Lisp 中对树使用 reduce

要在 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是一个通用函数,有时您必须保留原始序列的结构和顺序。例如,mapfilter可以用 来实现reduce。如果我想my-map基于编写 的实现reduce,那么:

(my-map '1+ '(1 (2 (3) …
Run Code Online (Sandbox Code Playgroud)

lisp tree common-lisp fold

2
推荐指数
1
解决办法
2250
查看次数

标签 统计

common-lisp ×2

fold ×1

lisp ×1

tree ×1