我有一個基本的clisp函數,我只是返回列表中的原子數。我遇到的問題是我需要它爲列表中的列表中的原子增加,而不是將列表看作列表中的1個元素。區分列表和普通lisp中的原子
我猜想的真正問題是如何在代碼中區分元素是列表還是原子?如果我能做到這一點,我可以將這些列表發送到另一個函數來合併並返回它們包含的原子數。
清澈如泥? :)
我這裏有一個例子:
(defun list_length (a)
(cond ((null a) 0)
(t (+ 1 (list_length (cdr a))))))
如果在父表中沒有列出嵌入,例如, '(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))))))
[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)
真棒,這正是我正在尋找。謝謝sepp2k。但是,這導致我到另一個問題......這是我的新代碼... (defun定義list_length(一) \t(條件((空一)0) \t \t((listp(車))( list_length(car a))) \t \t(t(+ 1(list_length(cdr a))))) ) 再次使用我的例子。它實際上會看到(4 5)是一個列表,然後進入它並計算這兩個原子,但是當它返回時,它忘記了大約6,然後返回程序。所以它增加了1 2 3 4 5,而不是6.我會在下面粘貼一個跟蹤。 – jmd4931 2010-11-05 01:14:07
這是醜陋的,張貼在上面的代碼。我發佈之前,我看到你的答覆的其餘部分,雖然我會嘗試添加該行的最後一部分。 – jmd4931 2010-11-05 01:18:27