所以我一直在考虑在lisp中展平列表.
但是,我想要做的是逐级压缩列表.
所以没有
(flatten '(a (b (d (g f))) e)) = (a b d g f e)
我想要
(flatten '(a (b (d (g f))) e)) = (a b (d (g f )) e )
关于如何做这个家伙的任何想法?
非常感谢=)
小智 5
你可以做这样的事情,例如:
(defun fletten-level (tree)
(loop for e in tree
nconc
(if (consp e)
(copy-list e)
(list e))))
(fletten-level '(a (b (d (g f))) e))
;; (A B (D (G F)) E)
Run Code Online (Sandbox Code Playgroud)
这将循环遍历原始树顶级分支,并创建一个新列表,其中包含分支是否为叶子,该叶子,以及分支是否有另外两个分支,然后是第一个叶子和其余分支.
编辑:对不起,第一次实际上并不好,现在应该修复.
EDIT2:因为我自己几乎感到困惑.(cons (car e) (cdr e))
看起来有点奇怪,因为它基本上和说的一样e
.但是,我意识到nconc
会破坏性地修改conses,所以它必须是这样的(即创建一个新的cons单元来连接而不是重用旧的).
EDIT3:哇......实际上,它必须是copy-list
,因为它会以这种方式修改原始列表.
归档时间: |
|
查看次数: |
2751 次 |
最近记录: |