1 ;;;; fastmap -- Fast version of MAP
3 ;;;; Copyright (c) 1991, by Luke Tierney. Permission is granted for
6 ;;;; The FASTMAP function is a version of MAP that is assumed to
8 ;;;; a) be reasonable fast on any combination of lists and vectors
11 ;;;; b) not hang if at least one of its arguments is not a circular
14 ;;;; This function is the core of the vectorized arithmetic system, so it
15 ;;;; may be worth optimizing for each CL implementation. I tried to improve
16 ;;;; it for (A)KCL but have not yet been able to obtain a significant
17 ;;;; increase in speed.
26 (in-package lisp-stat-basics
)
28 (in-package 'lisp-stat-basics
)
35 (defun cdr-lists (args)
36 (do ((list args
(cdr list
))) ((null list
))
37 (if (consp (car list
)) (rplaca list
(cdar list
)))))
39 (defun get-result-size (args)
40 (macrolet ((any-nulls (ls) `(dolist (x ,ls
) (if (null x
) (return t
)))))
46 (setf n
(if n
(min n
(length x
)) (length x
)))))
51 (if (or (<= n m
) (any-nulls lists
)) (return))
58 (if (any-nulls lists
) (return))
64 (defun fastmap (type fcn
&rest args
)
65 (cond ((and (eq type
'list
) (every #'listp args
))
66 (apply #'mapcar fcn args
))
67 ((and (eq type
'vector
) (every #'vectorp args
))
68 (apply #'map
'vector fcn args
))
69 ((every #'sequencep args
)
70 (let* ((n (get-result-size args
))
71 (result (make-sequence type n
))
72 (farg (make-list (length args
))))
74 (macrolet ((fill-arglist ()
75 `(do ((f farg
(cdr f
))
87 (rplaca r
(apply fcn farg
))
93 (setf (aref result i
) (apply fcn farg
))
95 (t (error "not all sequences"))))