by shigemk2

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

対話によるCommon Lisp入門 33 適当に反復

こういう感じでappendする関数があったとしましょう。

1]> (defun append$ (lst1 lst2)
(if (null lst1) lst2
(cons (first lst1) (append$ (rest lst1) lst2)))))
APPEND$
[2]> (append$ '(a b c d e f g) '(h))

この関数は、中身を見たら分かるけども、短いほうを左にしたほうが処理速度が早くなる。

例えばこんな感じのリストがあるとして、

(setf done '())
(do '(i 0 (+ i 1))
((> i 10000) done)
(setf done (cons i done)))
;; (10000 9999 9998 .... 2 0)

(append$ done '(-1))と、(append$ '(-1) done)とでは、処理速度が圧倒的に違う。
というか、(append$ done '(-1))だとスタックオーバーフローが起きた。