X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fpcl%2Fwalk.lisp;h=7430d6fc8f6f4d368f61218c4b18236bf632d060;hb=ec735ab75335c1744b39190314142a7e6f1ecdb3;hp=210c4e079cda90bc0944be26126fc6ce87f8e7b9;hpb=800e2822d7004944c3aca5d12a7596ac8c6caca6;p=sbcl.git diff --git a/src/pcl/walk.lisp b/src/pcl/walk.lisp index 210c4e0..7430d6f 100644 --- a/src/pcl/walk.lisp +++ b/src/pcl/walk.lisp @@ -101,8 +101,9 @@ ;;; So, now we hide our bits of interest in the walker-info slot in ;;; our new BOGO-FUN. ;;; -;;; MACROEXPAND-1 is the only SBCL function that gets called with the -;;; constructed environment argument. +;;; MACROEXPAND-1 and SB-INT:EVAL-IN-LEXENV are the only SBCL +;;; functions that get called with the constructed environment +;;; argument. (/show "walk.lisp 108") @@ -195,15 +196,17 @@ (push (list (car mac) (convert-macro-to-lambda (cadr mac) (cddr mac) + ,old-env (string (car mac)))) ,macros)))) (with-augmented-environment (,new-env ,old-env :functions ,functions :macros ,macros) ,@body)))) -(defun convert-macro-to-lambda (llist body &optional (name "dummy macro")) +(defun convert-macro-to-lambda (llist body env &optional (name "dummy macro")) (let ((gensym (make-symbol name))) - (eval `(defmacro ,gensym ,llist ,@body)) + (eval-in-lexenv `(defmacro ,gensym ,llist ,@body) + (sb-c::make-restricted-lexenv env)) (macro-function gensym))) ;;;; the actual walker @@ -263,7 +266,7 @@ (defun variable-symbol-macro-p (var env) (let ((entry (member var (env-lexical-variables env) :key #'car))) - (when (eq (cadar entry) :macro) + (when (eq (cadar entry) 'sb-sys:macro) entry))) (defvar *var-declarations* '(special)) @@ -844,7 +847,7 @@ :lexical-variables (append (mapcar (lambda (binding) `(,(car binding) - :macro . ,(cadr binding))) + sb-sys:macro . ,(cadr binding))) bindings) (env-lexical-variables old-env))) (relist* form 'symbol-macrolet bindings