diff options
| -rw-r--r-- | sb-eval2.lisp | 44 | 
1 files changed, 17 insertions, 27 deletions
diff --git a/sb-eval2.lisp b/sb-eval2.lisp index 60b145f..26c57af 100644 --- a/sb-eval2.lisp +++ b/sb-eval2.lisp @@ -440,22 +440,10 @@         (incf ,x ,num)         ,old-x))) -(sb-c:def-ir1-translator current-binding-pointer (() start next result) -  (sb-c::ir1-convert -   start next result -   `(sb-sys:%primitive sb-c:current-binding-pointer))) - -(sb-c:def-ir1-translator unbind-to-here ((bs) start next result) -  (sb-c::ir1-convert -   start next result -   `(sb-sys:%primitive sb-c:unbind-to-here ,bs))) - -(sb-c:def-ir1-translator bind ((var val) start next result) -  (sb-c::ir1-convert -   start next result -   `(let ((val ,val)) -      (sb-c::about-to-modify-symbol-value ',var 'progv val t) -      (sb-sys:%primitive sb-c:bind val ,var)))) +(defmacro nlet (loop-var bindings &body body) +  `(labels ((,loop-var ,(mapcar #'first bindings) +              ,@body)) +     (,loop-var ,@(mapcar #'second bindings))))  (declaim (ftype (function * eval-closure) prepare-lambda))  (defun prepare-lambda (lambda-form context) @@ -517,18 +505,18 @@                     ;; All this ELT and LENGTH stuff is not as                     ;; inefficient as it looks.  SBCL transforms                     ;; &rest into &more here. -                   (let* ((rest -                            (when (or restp keyp) -                              (loop for i -                                    from (+ required-num optional-num) -                                    below (length args) -                                    collect (elt args i)))) +                   (nlet iter +                         ((rest +                           (when (or restp keyp) +                             (loop for i +                                   from (+ required-num optional-num) +                                   below (length args) +                                   collect (elt args i))))                            (restnum (- (length args) (+ required-num optional-num)))                            (keys-checked-p nil)                            (my-default-values* default-values*)                            (my-keywords keywords)                            (my-varspecs varspecs) -                          (saved-binding-pointer (current-binding-pointer))                            (argi 0)  ;how many actual arguments have                                      ;been processed                            (vari 0)  ;how many lexical vars have been @@ -550,7 +538,11 @@                                          (assert (eq :special                                                      (car varspec))                                                  (varspec)) -                                        (bind var value))))))) +                                        (return-from iter +                                          (progv (list var) (list value) +                                            (iter rest restnum keys-checked-p +                                                  my-default-values* my-keywords +                                                  my-varspecs argi vari i)))))))))                         (declare (inline push-args))                         (prog ()                          positional @@ -635,9 +627,7 @@                              (push-args rest))                          final-call                            (return -                            (unwind-protect -                                 (funcall body* new-env) -                              (unbind-to-here saved-binding-pointer)))))))) +                            (funcall body* new-env)))))))                ;;(declare (inline handle-arguments))                (if envp                    (lambda (env)  | 
