要素を左から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