use*_*317 3 lisp common-lisp difference-lists
我在LISP中有这个功课,我需要从列表中挑选出原子然后的子列表.我确信这应该是一件容易的事,但由于我不是一个程序员,所以这真的花了很长时间让我理解.
我有这个数字列表:
(5 -1 (2 6 1) (8 7 -3) (0 (9 4)) -6)
Run Code Online (Sandbox Code Playgroud)
如果我理解我的任务,那么我应该得到这样的东西:
(5 -1 -6 (2 6 1) (8 7 -3) (0 (9 4)))
Run Code Online (Sandbox Code Playgroud)
到目前为止,我发现的是如何计算原子和/或子列表,但我不需要.
(DEFUN ATOMNUMBER (L) (COND ((NULL L) 0)
((ATOM (CAR L)) (+ 1 (ATOMNUMBER (CDR L))))
(T (ATOMNUMBER (CDR L))) ))
Run Code Online (Sandbox Code Playgroud)
即使只有子列表,只有原子或只是空列表,该函数也应该正常工作.
也许有人可以给我任何例子?
提前致谢!
Common Lisp有几种可能的方法:
使用REMOVE-IF删除不需要的物品.(或者使用REMOVE-IF-NOT来保存想要的物品.)你需要两个清单.附加它们.
使用DOLIST并遍历列表,将项目收集到两个列表中并附加它们
编写一个递归过程,您需要保留两个结果列表.
它也应该可以使用带有特殊排序谓词的SORT.
例:
> (sort '(1 (2 6 1) 4 (8 7 -3) 4 1 (0 (9 4)) -6 10 1)
(lambda (a b)
(atom a)))
(1 10 -6 1 4 4 1 (2 6 1) (8 7 -3) (0 (9 4)))
Run Code Online (Sandbox Code Playgroud)
作为稳定版本:
(stable-sort '(1 (2 6 1) 4 (8 7 -3) 4 1 (0 (9 4)) -6 10 1)
(lambda (a b)
(and (atom a)
(not (atom b)))))
(1 4 4 1 -6 10 1 (2 6 1) (8 7 -3) (0 (9 4)))
Run Code Online (Sandbox Code Playgroud)