SHOW:
|
|
- or go back to the newest paste.
| 1 | (defun flatten (x &optional y) | |
| 2 | (declare (optimize (speed 3) (safety 0))) | |
| 3 | (cond | |
| 4 | ((null x) | |
| 5 | (cond | |
| 6 | ((null y) nil) | |
| 7 | ((listp (car y)) | |
| 8 | (flatten (car y) (cdr y))) | |
| 9 | (t (cons (car y) (flatten (cdr y)))))) | |
| 10 | ((listp (car x)) | |
| 11 | (flatten (car x) (if y (list (cdr x) y) (cdr x)))) | |
| 12 | (t (cons (car x) (flatten (cdr x) y))))) | |
| 13 | ||
| 14 | (defun flatten-1 (l) | |
| 15 | (declare (optimize (speed 3) (safety 0))) | |
| 16 | (cond | |
| 17 | ((null l) nil) | |
| 18 | ((atom l) (list l)) | |
| 19 | (t (loop for a in l appending (flatten-1 a))))) | |
| 20 | ||
| 21 | (defun flatten-2 (l) | |
| 22 | (declare (optimize (speed 3) (safety 0))) | |
| 23 | (when l | |
| 24 | (if (atom l) | |
| 25 | (list l) | |
| 26 | (mapcan #'flatten-2 l)))) | |
| 27 | ||
| 28 | (defun flatten-3 (x) | |
| 29 | (declare (optimize (speed 3) (safety 0))) | |
| 30 | (do ((a x)) | |
| 31 | ((null a)) | |
| 32 | (if (listp (car a)) | |
| 33 | (do ((b (car a) (cdr b)) | |
| 34 | (c a) | |
| 35 | (d (cdr a))) | |
| 36 | - | (print (- (get-internal-real-time) test))) |
| 36 | + | ((null b) |
| 37 | - | ;; results |
| 37 | + | (and (setf (cdr c) d) nil)) |
| 38 | - | ;; 886 |
| 38 | + | (setf (car c) (car b) |
| 39 | - | ;; 2868 |
| 39 | + | (cdr c) (cdr b) |
| 40 | - | ;; 1828 |
| 40 | + | c (or (cdr c) c))) |
| 41 | (setf a (cdr a)))) x) | |
| 42 | ||
| 43 | ;; 353 | |
| 44 | ;; 2056 | |
| 45 | ;; 1230 | |
| 46 | ;; 63 | |
| 47 | ||
| 48 | (let ((test (get-internal-real-time))) | |
| 49 | (dotimes (i 1e6) | |
| 50 | (flatten '(1 2 (3 4) (5 (6 (7 8) 9 a (10))) b (10.5 (1.6) (1.7)) 11))) | |
| 51 | (print (- (get-internal-real-time) test)) | |
| 52 | (setf test (get-internal-real-time)) | |
| 53 | (dotimes (i 1e6) | |
| 54 | (flatten-2 '(1 2 (3 4) (5 (6 (7 8) 9 a (10))) b (10.5 (1.6) (1.7)) 11))) | |
| 55 | (print (- (get-internal-real-time) test)) | |
| 56 | (setf test (get-internal-real-time)) | |
| 57 | (dotimes (i 1e6) | |
| 58 | (flatten-1 '(1 2 (3 4) (5 (6 (7 8) 9 a (10))) b (10.5 (1.6) (1.7)) 11))) | |
| 59 | (print (- (get-internal-real-time) test)) | |
| 60 | (setf test (get-internal-real-time)) | |
| 61 | (dotimes (i 1e6) | |
| 62 | (flatten-3 '(1 2 (3 4) (5 (6 (7 8) 9 a (10))) b (10.5 (1.6) (1.7)) 11))) | |
| 63 | (print (- (get-internal-real-time) test))) |