by shigemk2

当面は技術的なことしか書かない

対話によるCommon Lisp入門 32 再帰でlength その2 補助関数を使う

前回

要素を左から1個ずつカウントしていくとして、そのカウントの中間結果を
countという変数に入れ、残りの未カウントの部分を表すリストをlstという変数に入れる。

[16]> (defun length$ (lst)
(length-loop lst 0))
LENGTH$
[17]> (defun length-loop (lst count)
(if (null lst) count
(length-loop (rest lst) (+ count 1))))
LENGTH-LOOP
[18]> (trace length$ length-loop)
;; Tracing function LENGTH$.
;; Tracing function LENGTH-LOOP.
(LENGTH$ LENGTH-LOOP)
[19]> (length$ '(a b c))
1. Trace: (LENGTH$ '(A B C))
2. Trace: (LENGTH-LOOP '(A B C) '0)
3. Trace: (LENGTH-LOOP '(B C) '1)
4. Trace: (LENGTH-LOOP '(C) '2)
5. Trace: (LENGTH-LOOP 'NIL '3)
5. Trace: LENGTH-LOOP ==> 3
4. Trace: LENGTH-LOOP ==> 3
3. Trace: LENGTH-LOOP ==> 3
2. Trace: LENGTH-LOOP ==> 3
1. Trace: LENGTH$ ==> 3
3

traceをやめるには、untraceだお

[20]> (untrace length$ length-loop)
(LENGTH$ LENGTH-LOOP)
[21]> (length$ '(a b c))
3