List 使用LISP迭代列表中的每个项目

List 使用LISP迭代列表中的每个项目,list,lisp,iteration,List,Lisp,Iteration,假设我的列表在其结构上可能有所不同——列表中可能有多个列表,我如何迭代每个元素? 列表示例:(或(和(不是a)(不是b))(或(和x)t))这是递归函数的一个很好的例子。你可能想要这样的东西: (defun iterate (l) (if (atom l) (do-something-with l) (mapcar #'iterate l))) 函数dosomething with显然定义了您希望对每个元素执行的操作。此外,mapcar还可以被另一个映射函数替换,具体取决于您是否希望累积“用做

假设我的列表在其结构上可能有所不同——列表中可能有多个列表,我如何迭代每个元素?
列表示例:(或(和(不是a)(不是b))(或(和x)t))

这是递归函数的一个很好的例子。你可能想要这样的东西:

(defun iterate (l) (if (atom l) (do-something-with l) (mapcar #'iterate l)))

函数dosomething with显然定义了您希望对每个元素执行的操作。此外,mapcar还可以被另一个映射函数替换,具体取决于您是否希望累积“用做某事”的结果。

这是maptree函数的典型情况

(defun maptree (fn tree)
  (cond
    ((null tree) tree)
    ((atom tree) (funcall fn tree))
    (t (cons
         (maptree fn (first tree))
         (maptree fn (rest tree))))))
因此,您可以执行
(maptree#“您的列表要做什么)

我将只打印所有元素,您可以提供您想要的任何函数,它将在树的每个元素上执行

CL-USER> (let ((lis 
                 '(or (and (not a) (not b)) (or (and x) t))))
           (maptree #'print lis)) 

OR 
AND 
NOT 
A 
NOT 
B 
OR 
AND 
X 
T 
从我记忆中的
累积树
,这可以被认为是树的
减少
。在CL中,它可能如下所示:

(defun iterate (l) (if (atom l) (do-something-with l) (mapcar #'iterate l)))
(定义累积树(树项组合器空值)
(标签)(记录(树)
(cond((空树)空值)
((原子树)(funcall术语树))
(t(funcall组合器(rec(car tree))
(rec(cdr树(()()())))
(记录树)
您可以在树中添加所有数字:

(定义参数*值树*”(12(34(56))3)
(累积树*价值树)*
(λ(x)(如果(编号x)x 0))
#'+
0) ; => 24
要实现@coredumps
映射树
,您使用
cons
作为组合器和
nil
ass nil值:

(定义映射树(函数树)
(累积树函数#'cons nil))

你需要说出你想对每个列表元素做什么。