首先从LISP中的列表中排序原子然后再列出子列表

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)

即使只有子列表,只有原子或只是空列表,该函数也应该正常工作.

也许有人可以给我任何例子?

提前致谢!

Rai*_*wig 7

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)