10分なら
寝る前にやってみようと思ったのに1時間かかった件 o...rz
10分でコーディング x 2 〜リストの破壊的操作篇〜 - 'T - cadr group
最初(loop for 〜 on 〜 …)使って書き始めてはまった。
(defun nalist-to-plist (alist) (do* ((result (car alist)) (a alist cdr) (car (car a) (car a)) (cdr (cdr a) (cdr a))) ((null a) result) (setf (car a) (cdr car) (cdr car) a (cdr a) (car cdr)))) (defun nplist-to-alist (plist) (do* ((result (cdr plist)) (p plist) (cdr (cdr p) (cdr p)) (cddr (cddr p) (cddr p))) ((null p) result) (setf (cdr p) (car cdr) (car cdr) p p (cdr cdr) (cdr cdr) (cdr p)))) (defun test () (prog ((data (loop :repeat 100000 :collect (cons 1 2)))) (time (nalist-to-plist data))) (prog ((data (loop :repeat 100000 :append (list 1 2)))) (time (nplist-to-alist data))))
CL-USER> (print (nalist-to-plist (print (nplist-to-alist '(foo 1 bar 2 baz 3))))) ((FOO . 1) (BAR . 2) (BAZ . 3)) (FOO 1 BAR 2 BAZ 3) (FOO 1 BAR 2 BAZ 3) CL-USER> (test) Evaluation took: 0.001 seconds of real time 0.000594 seconds of total run time (0.000585 user, 0.000009 system) 100.00% CPU 1,410,552 processor cycles 0 bytes consed Evaluation took: 0.001 seconds of real time 0.000622 seconds of total run time (0.000613 user, 0.000009 system) 100.00% CPU 1,649,724 processor cycles 0 bytes consed
明日もうちょっと綺麗な書き方考える。