Another way to do the same without using a loop (although it is conceptually similar)
(defun add-two-lists (abc &optional (dc)) (if a (add-two-lists (cdr a) (cdr b) (cdr (rplaca c (+ (car a) (car b)))) d) d)) (add-two-lists '(1 2 3 4 5) '(1 2 3 4 5) '(nil nil nil nil nil))
EDIT
(defun add-two-lists (abc &optional (dc)) (if a (add-two-lists (cdr a) (cdr b) (cdr (rplaca c (+ (car a) (car b)))) d) d)) (time (dotimes (i 1e6) (add-two-lists '(1 2 3 4 5) '(1 2 3 4 5) '(nil nil nil nil nil)))) ;; Evaluation took: ;; 0.077 seconds of real time ;; 0.076004 seconds of total run time (0.076004 user, 0.000000 system) ;; 98.70% CPU ;; 214,723,476 processor cycles ;; 0 bytes consed (defun add-two-lists-1 (list1 list2 list3) (loop for a in list1 for b in list2 for c on list3 do (rplaca c (+ ab)))) (time (dotimes (i 1e6) (add-two-lists-1 '(1 2 3 4 5) '(1 2 3 4 5) '(nil nil nil nil nil)))) ;; Evaluation took: ;; 0.060 seconds of real time ;; 0.060004 seconds of total run time (0.060004 user, 0.000000 system) ;; 100.00% CPU ;; 169,395,444 processor cycles ;; 0 bytes consed
EDIT 2
But pay attention to the optimized version behavior. Maybe, again, YMMV, but this is what I get on 64-bit Debian with SBCL.
(defun add-two-lists (abc &optional (dc)) (declare (optimize (speed 3) (safety 0))) (declare (type list abcd)) (if a (add-two-lists (cdr a) (cdr b) (cdr (rplaca c (the fixnum (+ (the fixnum (car a)) (the fixnum (car b)))))) d) d)) (time (dotimes (i 1e6) (add-two-lists '(1 2 3 4 5) '(1 2 3 4 5) '(nil nil nil nil nil)))) ;; Evaluation took: ;; 0.041 seconds of real time ;; 0.040002 seconds of total run time (0.040002 user, 0.000000 system) ;; 97.56% CPU ;; 114,176,175 processor cycles ;; 0 bytes consed (defun add-two-lists-1 (list1 list2 list3) (declare (optimize (speed 3) (safety 0))) (loop for a fixnum in list1 for b fixnum in list2 for c cons on list3 do (rplaca c (the fixnum (+ ab))))) (time (dotimes (i 1e6) (add-two-lists-1 '(1 2 3 4 5) '(1 2 3 4 5) '(nil nil nil nil nil)))) ;; Evaluation took: ;; 0.040 seconds of real time ;; 0.040003 seconds of total run time (0.040003 user, 0.000000 system) ;; 100.00% CPU ;; 112,032,123 processor cycles ;; 0 bytes consed
user797257
source share