X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fpcl%2Fwalk.lisp;h=dcdd282619eb3eccb9a6161a25ad9f129f53b9bc;hb=80f222325e1f677e5cf8de01c6990906fa47f65d;hp=bca2bda4f12c08a6f78795796931c31ec1f5fd3b;hpb=310d5f86d736ecf9525711b087b04797c549879c;p=sbcl.git diff --git a/src/pcl/walk.lisp b/src/pcl/walk.lisp index bca2bda..dcdd282 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))) @@ -355,13 +358,19 @@ `(eval-when (:load-toplevel :execute) (setf (get-walker-template-internal ',name) ',template))) -(defun get-walker-template (x) +(defun get-walker-template (x context) (cond ((symbolp x) (get-walker-template-internal x)) ((and (listp x) (eq (car x) 'lambda)) '(lambda repeat (eval))) (t - (error "can't get template for ~S" x)))) + ;; FIXME: In an ideal world we would do something similar to + ;; COMPILER-ERROR here, replacing the form within the walker + ;; with an error-signalling form. This is slightly less + ;; pretty, but informative non the less. Best is the enemy of + ;; good, etc. + (error "Illegal function call in method body:~% ~S" + context)))) ;;;; the actual templates @@ -397,6 +406,8 @@ ;;; 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) @@ -447,7 +458,7 @@ newform))) (t (let* ((fn (car newform)) - (template (get-walker-template fn))) + (template (get-walker-template fn newform))) (if template (if (symbolp template) (funcall template newform context env) @@ -618,7 +629,7 @@ (cdr body) fn env doc-string-p declarations))) ((and form (listp form) - (null (get-walker-template (car form))) + (null (get-walker-template (car form) form)) (progn (multiple-value-setq (new-form macrop) (sb-xc:macroexpand-1 form env)) @@ -704,21 +715,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) @@ -860,7 +856,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)))