Changeset 12709


Ignore:
Timestamp:
Aug 28, 2009, 10:14:02 AM (9 years ago)
Author:
gb
Message:

When processing toplevel MACROLET, SYMBOL-MACROLET, and LOCALLY, augment the
compile-time environment as well as the lexical environment (so that definitions
and declarations are visible if the body's processed at compile-time.)

I think that this fixes ticket:592 without breaking anything that r10942 was
intended to fix.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/lib/nfcomp.lisp

    r12679 r12709  
    1 ;;;-*-Mode: LISP; Package: CCL -*-
     1;;-*-Mode: LISP; Package: CCL -*-
    22;;;
    33;;;   Copyright (C) 1994-2001 Digitool, Inc
     
    624624  (fcomp-compile-toplevel-forms env)
    625625  (multiple-value-bind (body decls) (parse-body body env)
    626     (let* ((env (augment-environment env :declare (decl-specs-from-declarations decls))))
     626    (let* ((decl-specs (decl-specs-from-declarations decls))
     627           (env (augment-environment env :declare decl-specs))
     628           (*fasl-compile-time-env* (augment-environment *fasl-compile-time-env*
     629                                                         :declare decl-specs)))
    627630      (fcomp-form-list body env processing-mode)
    628631      (fcomp-compile-toplevel-forms env))))
     
    630633(defun fcomp-macrolet (form env processing-mode &aux (body (%cdr form)))
    631634  (fcomp-compile-toplevel-forms env)
    632   (let ((outer-env (augment-environment env
    633                                         :macro
    634                                         (mapcar #'(lambda (m)
    635                                                     (destructuring-bind (name arglist &body body) m
    636                                                       (list name (enclose (parse-macro name arglist body env)
    637                                                                           env))))
    638                                                 (car body)))))
    639     (multiple-value-bind (body decls) (parse-body (cdr body) outer-env)
    640       (let* ((env (augment-environment
    641                    outer-env
    642                    :declare (decl-specs-from-declarations decls))))
    643         (fcomp-form-list body env processing-mode)
    644         (fcomp-compile-toplevel-forms env)))))
     635  (flet ((augment-with-macros (e defs)
     636           (augment-environment e
     637                                :macro
     638                                (mapcar #'(lambda (m)
     639                                            (destructuring-bind (name arglist &body body) m
     640                                              (list name (enclose (parse-macro name arglist body env)
     641                                                                  e))))
     642                                        defs))))
     643           
     644    (let* ((macros (car body))
     645           (outer-env (augment-with-macros env macros)))
     646      (multiple-value-bind (body decls) (parse-body (cdr body) outer-env)
     647        (let* ((decl-specs (decl-specs-from-declarations decls))
     648               (env (augment-environment
     649                     outer-env
     650                     :declare decl-specs))
     651               (*fasl-compile-time-env* (augment-environment
     652                                         (augment-with-macros
     653                                          *fasl-compile-time-env*
     654                                          macros)
     655                                         :declare decl-specs)))
     656          (fcomp-form-list body env processing-mode)
     657          (fcomp-compile-toplevel-forms env))))))
    645658
    646659(defun fcomp-symbol-macrolet (form env processing-mode &aux (body (%cdr form)))
    647660  (fcomp-compile-toplevel-forms env)
    648   (let* ((outer-env (augment-environment env :symbol-macro (car body))))
     661  (let* ((defs (car body))
     662         (outer-env (augment-environment env :symbol-macro defs)))
    649663    (multiple-value-bind (body decls) (parse-body (cdr body) env)
    650       (let* ((env (augment-environment outer-env
    651                                        :declare (decl-specs-from-declarations decls))))
     664      (let* ((decl-specs (decl-specs-from-declarations decls))
     665             (env (augment-environment outer-env
     666                                       :declare decl-specs))
     667             (*fasl-compile-time-env* (augment-environment *fasl-compile-time-env*
     668                                                           :symbol-macro defs
     669                                                           :declare decl-specs)))
    652670        (fcomp-form-list body env processing-mode)
    653671        (fcomp-compile-toplevel-forms env)))))
Note: See TracChangeset for help on using the changeset viewer.