X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=contrib%2Fsb-cltl2%2Fcompiler-let.lisp;h=6b82f8dea9b073be571825fbfd1a3e797894909c;hb=970dd272dc84f7420252eadb4829cc193f795716;hp=932b4cb5e73e138b72dda367b8d0739a1be25736;hpb=485d9c8e2d3a4ae0561cd57b55a6c6a28cd4bce4;p=sbcl.git diff --git a/contrib/sb-cltl2/compiler-let.lisp b/contrib/sb-cltl2/compiler-let.lisp index 932b4cb..6b82f8d 100644 --- a/contrib/sb-cltl2/compiler-let.lisp +++ b/contrib/sb-cltl2/compiler-let.lisp @@ -29,3 +29,21 @@ 'compiler-let bindings walked-body))))))) (sb-walker::define-walker-template compiler-let walk-compiler-let) + +#+sb-eval +(setf (getf sb-eval::*eval-dispatch-functions* 'compiler-let) + (lambda (form env) + (destructuring-bind (bindings &body body) (cdr form) + (loop for binding in bindings + if (atom binding) + collect binding into vars + and collect nil into values + else do (assert (proper-list-of-length-p binding 1 2)) + and collect (first binding) into vars + and collect (eval (second binding)) into values + finally (return + (let ((new-env (sb-eval::make-env + :parent env + :vars (sb-eval::special-bindings vars)))) + (progv vars values + (sb-eval::eval-progn body new-env))))))))