`(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))))
\f
;;;; the actual templates
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)
(defun walk-template-handle-repeat (form template stop-form context env)
(if (eq form stop-form)
(walk-template form (cdr template) context env)
- (walk-template-handle-repeat-1 form
- template
- (car template)
- stop-form
- context
- env)))
+ (walk-template-handle-repeat-1
+ form template (car template) stop-form context env)))
(defun walk-template-handle-repeat-1 (form template repeat-template
stop-form context env)
(if (null repeat-template)
(walk-template stop-form (cdr template) context env)
(error "while handling code walker REPEAT:
- ~%ran into STOP while still in REPEAT template")))
+ ~%ran into STOP while still in REPEAT template")))
((null repeat-template)
(walk-template-handle-repeat-1
form template (car template) stop-form context env))
(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))