ベタベタに反復な append です.でもきっとビルトインの append はこんな
動きをするハズです.速度と効率しか見てません.
>>294 さんの指摘でさらに長くなりました….

(defun my-append (&rest lsts)
;; 頭の nil をとばす
(do ((l lsts (cdr l)))
((or (null lsts) (not (null (car l)))) (setq lsts l)))
;; 先頭が atom のみだったらそれを返す
(when (atom (car lsts))
(if (null (cdr lsts))
(return-from my-append (car lsts))
(error "~S is not a list." (car lsts))))
;; 先頭となる result と cons したセルを指す ptr を準備
(let* ((result (cons (caar lsts) nil))
(ptr result))
;; 先頭のリストを cons する.このとき ptr はリストの末尾のセルを指す
(do ((p (cdar lsts) (cdr p)))
((null p))
(setq ptr (setf (cdr ptr) (cons (car p) nil))))
;; 末尾のリスト以外をコピー(末尾のリストは ptr で指すだけ)
(do ((l (cdr lsts) (cdr l)))
((null (cdr l))
(setq ptr (setf (cdr ptr) (car l)))
result)
;; 個々の lst の複製リスト
(do ((p (car l) (cdr p)))
((null p))
(setq ptr (setf (cdr ptr) (cons (car p) nil)))))))