summaryrefslogtreecommitdiff
path: root/sb-eval2.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'sb-eval2.lisp')
-rw-r--r--sb-eval2.lisp30
1 files changed, 21 insertions, 9 deletions
diff --git a/sb-eval2.lisp b/sb-eval2.lisp
index 3ae5fb0..3d075f7 100644
--- a/sb-eval2.lisp
+++ b/sb-eval2.lisp
@@ -249,15 +249,27 @@
(multiple-value-bind (required optional restp rest keyp keys allowp auxp aux
morep more-context more-count)
(sb-int:parse-lambda-list lambda-list)
- (lambda (env)
- (lambda (&rest args)
- (declare (dynamic-extent args))
- ;; FIXME: non-simple lambda-lists
- (let ((new-env (make-environment env n)))
- (loop for i from 0 to n
- for val in args
- do (setf (environment-value new-env 0 i) val))
- (funcall body* new-env))))))))
+ (if (< n 20)
+ (specialize m% n (loop for i from 0 below 20 collect i)
+ (let ((args (loop for i from 0 below m%
+ collect (gensym (format nil "ARG~D-" i)))))
+ `(lambda (env)
+ (lambda ,args
+ ;; FIXME: non-simple lambda-lists
+ (let ((new-env (make-environment env n)))
+ ,@(loop for i from 0
+ for val in args
+ collect `(setf (environment-value new-env 0 ,i) ,val))
+ (funcall body* new-env))))))
+ (lambda (env)
+ (lambda (&rest args)
+ (declare (dynamic-extent args))
+ ;; FIXME: non-simple lambda-lists
+ (let ((new-env (make-environment env n)))
+ (loop for i from 0 to n
+ for val in args
+ do (setf (environment-value new-env 0 i) val))
+ (funcall body* new-env)))))))))
(defun context->native-environment (context)
;;FIXME