在常见的lisp中区分列表和原子

jmd*_*931 5 algorithm clisp common-lisp

我有一个基本的clisp函数,我只是返回列表中的原子数.我遇到的问题是我需要它来增加列表中列表中的原子,而不是将列表视为列表中的1个元素.

我猜的真正问题是你如何在代码中区分元素是列表还是原子?如果我可以这样做,我可以将列表发送到另一个函数来添加并返回它们包含的原子数.

像泥一样清楚?:)

我在这里有一个例子:

(defun list_length (a)
  (cond ((null a) 0)
        (t (+ 1 (list_length (cdr a))))))
Run Code Online (Sandbox Code Playgroud)

如果父列表中没有嵌入列表,这将很有用,例如, '(1 2 3 (4 5) 6)将返回5.我需要它包括4和5而不是列表(4 5)作为一个.

谢谢你的帮助.

乔恩


编辑:

(defun list_length (a)
  (cond ((null a) 0)
        ((listp (car a)) (list_length (car a)))
        (t (+ 1 (list_length (cdr a))))))
Run Code Online (Sandbox Code Playgroud)
[18]> (list_length '(1 2 3 (4 5) 6))
1. Trace: (LIST_LENGTH '(1 2 3 (4 5) 6))
2. Trace: (LIST_LENGTH '(2 3 (4 5) 6))
3. Trace: (LIST_LENGTH '(3 (4 5) 6))
4. Trace: (LIST_LENGTH '((4 5) 6))
5. Trace: (LIST_LENGTH '(4 5))
6. Trace: (LIST_LENGTH '(5))
7. Trace: (LIST_LENGTH 'NIL)
7. Trace: LIST_LENGTH ==> 0
6. Trace: LIST_LENGTH ==> 1
5. Trace: LIST_LENGTH ==> 2
4. Trace: LIST_LENGTH ==> 2
3. Trace: LIST_LENGTH ==> 3
2. Trace: LIST_LENGTH ==> 4
1. Trace: LIST_LENGTH ==> 5
5
[19]> (dribble)
Run Code Online (Sandbox Code Playgroud)

sep*_*p2k 5

(listp foo)t如果foo是列表则返回,否则返回nil

因此,您可以list_length通过将以下情况添加到您的函数中来使您的函数处理嵌套列表cond

((listp (car a)) (+ (list_length (car a)) (list_length (cdr a))))
Run Code Online (Sandbox Code Playgroud)