X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fpcl%2Fwalk.lisp;h=ac68857dcdb9acba48ba199cd1512a9a8ea486a1;hb=1b650be8b800cf96e2c268ae317fb26d0bf36827;hp=05d7f511d01909efca1038eb3c529f356b17bf7f;hpb=eadecfd6fd102f5c8eda32770153ceed2f9f3b70;p=sbcl.git diff --git a/src/pcl/walk.lisp b/src/pcl/walk.lisp index 05d7f51..ac68857 100644 --- a/src/pcl/walk.lisp +++ b/src/pcl/walk.lisp @@ -153,6 +153,9 @@ (let ((lexenv (sb!kernel::coerce-to-lexenv env))) (sb!c::make-lexenv :default lexenv + :vars (when (eql (caar macros) *key-to-walker-environment*) + (copy-tree (remove :lexical-var (fourth (cadar macros)) + :key #'cadr))) :funs (append (mapcar (lambda (f) (cons (car f) (sb!c::make-functional :lexenv lexenv))) @@ -236,14 +239,14 @@ (defun walker-environment-bind-1 (env &key (walk-function nil wfnp) (walk-form nil wfop) (declarations nil decp) - (lexical-variables nil lexp)) - (let ((lock (environment-macro env *key-to-walker-environment*))) + (lexical-vars nil lexp)) + (let ((lock (env-lock env))) (list (list *key-to-walker-environment* - (list (if wfnp walk-function (car lock)) - (if wfop walk-form (cadr lock)) - (if decp declarations (caddr lock)) - (if lexp lexical-variables (cadddr lock))))))) + (list (if wfnp walk-function (car lock)) + (if wfop walk-form (cadr lock)) + (if decp declarations (caddr lock)) + (if lexp lexical-vars (cadddr lock))))))) (defun env-walk-function (env) (car (env-lock env))) @@ -397,6 +400,9 @@ ;;; SBCL-only special forms (define-walker-template sb!ext:truly-the (nil quote eval)) +;;; FIXME: maybe we don't need this one any more, given that +;;; NAMED-LAMBDA now expands into (FUNCTION (NAMED-LAMBDA ...))? +(define-walker-template named-lambda walk-named-lambda) (defvar *walk-form-expand-macros-p* nil) @@ -487,10 +493,7 @@ (set (walk-form-internal form :set env)) ((lambda call) - (cond ((or (symbolp form) - (and (listp form) - (= (length form) 2) - (eq (car form) 'setf))) + (cond ((legal-fun-name-p form) form) (t (walk-form-internal form context env))))) (case (car template) @@ -706,21 +709,6 @@ (relist* form locally walked-body))) -(defun walk-let-if (form context env) - (let ((test (cadr form)) - (bindings (caddr form)) - (body (cdddr form))) - (walk-form-internal - `(let () - (declare (special ,@(mapcar (lambda (x) (if (listp x) (car x) x)) - bindings))) - (flet ((.let-if-dummy. () ,@body)) - (if ,test - (let ,bindings (.let-if-dummy.)) - (.let-if-dummy.)))) - context - env))) - (defun walk-multiple-value-setq (form context env) (let ((vars (cadr form))) (if (some (lambda (var) @@ -818,6 +806,20 @@ walked-arglist walked-body)))) +(defun walk-named-lambda (form context old-env) + (walker-environment-bind (new-env old-env) + (let* ((name (second form)) + (arglist (third form)) + (body (cdddr form)) + (walked-arglist (walk-arglist arglist context new-env)) + (walked-body + (walk-declarations body #'walk-repeat-eval new-env))) + (relist* form + (car form) + name + walked-arglist + walked-body)))) + (defun walk-setq (form context env) (if (cdddr form) (let* ((expanded (let ((rforms nil) @@ -848,7 +850,7 @@ (body (cddr form))) (walker-environment-bind (new-env old-env - :lexical-variables + :lexical-vars (append (mapcar (lambda (binding) `(,(car binding) sb!sys:macro . ,(cadr binding))) @@ -968,4 +970,4 @@ (defmacro with-rpush (&body body) `(with-lexical-macros ,(list (list 'rpush #'expand-rpush)) ,@body)) -|# \ No newline at end of file +|#