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))
你需要说出你想对每个列表元素做什么。