Ticket #1309: 0001-Let-macros-know-if-they-run-at-toplevel.patch

File 0001-Let-macros-know-if-they-run-at-toplevel.patch, 38.5 KB (added by sjamaan, 7 years ago)

Initial attempt to teach compiler and evaluator about toplevel

  • NEWS

    From 4033a9c29332146882a984f7cd183c50610f45b0 Mon Sep 17 00:00:00 2001
    From: Peter Bex <peter@more-magic.net>
    Date: Thu, 8 Dec 2016 21:40:45 +0100
    Subject: [PATCH] Let macros know if they run at toplevel.
    
    This allows us to error out when encountering a definition in an
    "expression context" (i.e., not at toplevel or in a place where an
    internal define is allowed)
    
    Fixes #1309
    ---
     NEWS                    |   2 +
     chicken-ffi-syntax.scm  |   3 +
     chicken-syntax.scm      |   5 ++
     core.scm                | 130 ++++++++++++++++++++---------------------
     eval.scm                | 151 ++++++++++++++++++++++++------------------------
     expand.scm              |  94 +++++++++++++++++-------------
     tests/functor-tests.scm |   2 +
     7 files changed, 209 insertions(+), 178 deletions(-)
    
    diff --git a/NEWS b/NEWS
    index 3d78582..5f33cd0 100644
    a b  
    5757- Syntax expander
    5858  - Removed support for (define-syntax (foo e r c) ...), which was
    5959    undocumented and not officially supported anyway.
     60  - define and friends are now aggressively rejected in "expression
     61    contexts" (i.e., anywhere but toplevel or as internal defines).
    6062
    61634.11.2
    6264
  • chicken-ffi-syntax.scm

    diff --git a/chicken-ffi-syntax.scm b/chicken-ffi-syntax.scm
    index 9bbe73f..0df4cbd 100644
    a b  
    5555 '()
    5656 (##sys#er-transformer
    5757  (lambda (form r c)
     58    (##sys#check-toplevel-definition 'define-external form)
    5859    (let* ((form (cdr form))
    5960           (quals (and (pair? form) (string? (car form))))
    6061           (var (and (not quals) (pair? form) (symbol? (car form)))) )
     
    100101 '()
    101102 (##sys#er-transformer
    102103  (lambda (form r c)
     104    (##sys#check-toplevel-definition 'define-location form)
    103105    (##sys#check-syntax 'define-location form '(_ variable _ . #(_ 0 1)))
    104106    (let ((var (cadr form))
    105107          (type (caddr form))
     
    212214 '()
    213215 (##sys#er-transformer
    214216  (lambda (form r c)
     217    (##sys#check-toplevel-definition 'define-foreign-variable form)
    215218    `(##core#define-foreign-variable ,@(cdr form)))))
    216219
    217220(##sys#extend-macro-environment
  • chicken-syntax.scm

    diff --git a/chicken-syntax.scm b/chicken-syntax.scm
    index b4a19a1..4937ff1 100644
    a b  
    5656 '()
    5757 (##sys#er-transformer
    5858  (lambda (form r c)
     59    (##sys#check-toplevel-definition 'define-constant form)
    5960    (##sys#check-syntax 'define-constant form '(_ symbol _))
    6061    `(##core#define-constant ,@(cdr form)))))
    6162
     
    6364 'define-record '()
    6465 (##sys#er-transformer
    6566  (lambda (x r c)
     67    (##sys#check-toplevel-definition 'define-record x) ; clearer error
    6668    (##sys#check-syntax 'define-record x '(_ symbol . _))
    6769    (let* ((name (cadr x))
    6870           (slots (cddr x))
     
    354356   'define-values '()
    355357   (##sys#er-transformer
    356358    (lambda (form r c)
     359      (##sys#check-toplevel-definition 'define-values form)
    357360      (##sys#check-syntax 'define-values form '(_ lambda-list _))
    358361      (##sys#decompose-lambda-list
    359362       (cadr form)
     
    467470 'define-inline '()
    468471 (##sys#er-transformer
    469472  (lambda (form r c)
     473    (##sys#check-toplevel-definition 'define-inline form)
    470474    (letrec ([quotify-proc
    471475              (lambda (xs id)
    472476                (##sys#check-syntax id xs '#(_ 1))
     
    840844 'define-record-printer '()
    841845 (##sys#er-transformer
    842846  (lambda (form r c)
     847    ;; TODO: Only allow at toplevel?  It's not really a definition...
    843848    (##sys#check-syntax 'define-record-printer form '(_ _ . _))
    844849    (let ([head (cadr form)]
    845850          [body (cddr form)])
  • core.scm

    diff --git a/core.scm b/core.scm
    index db6337d..e0a18b9 100644
    a b  
    529529      (d `(RESOLVE-VARIABLE: ,x0 ,x ,(map (lambda (x) (car x)) se)))
    530530      (cond ((not (symbol? x)) x0)      ; syntax?
    531531            ((##sys#hash-table-ref constant-table x)
    532              => (lambda (val) (walk val e se dest ldest h #f)))
     532             => (lambda (val) (walk val e se dest ldest h #f #f)))
    533533            ((##sys#hash-table-ref inline-table x)
    534              => (lambda (val) (walk val e se dest ldest h #f)))
     534             => (lambda (val) (walk val e se dest ldest h #f #f)))
    535535            ((assq x foreign-variables)
    536536             => (lambda (fv)
    537537                  (let* ((t (second fv))
     
    541541                     (foreign-type-convert-result
    542542                      (finish-foreign-result ft body)
    543543                      t)
    544                      e se dest ldest h #f))))
     544                     e se dest ldest h #f #f))))
    545545            ((assq x location-pointer-map)
    546546             => (lambda (a)
    547547                  (let* ((t (third a))
     
    551551                     (foreign-type-convert-result
    552552                      (finish-foreign-result ft body)
    553553                      t)
    554                      e se dest ldest h #f))))
     554                     e se dest ldest h #f #f))))
    555555            ((##sys#get x '##core#primitive))
    556556            ((not (memq x e)) (##sys#alias-global-hook x #f h)) ; only if global
    557557            (else x))))
     
    579579                 (for-each pretty-print imps)
    580580                 (print "\n;; END OF FILE"))))) ) )
    581581
    582   (define (walk x e se dest ldest h outer-ln)
     582  (define (walk x e se dest ldest h outer-ln tl?)
    583583    (cond ((symbol? x)
    584584           (cond ((keyword? x) `(quote ,x))
    585585                 ((memq x unlikely-variables)
     
    600600             (set! ##sys#syntax-error-culprit x)
    601601             (let* ((name0 (lookup (car x) se))
    602602                    (name (or (and (symbol? name0) (##sys#get name0 '##core#primitive)) name0))
    603                     (xexpanded (expand x se compiler-syntax-enabled)))
     603                    (xexpanded (expand x se compiler-syntax-enabled tl?)))
    604604               (when ln (update-line-number-database! xexpanded ln))
    605605               (cond ((not (eq? x xexpanded))
    606                       (walk xexpanded e se dest ldest h ln))
     606                      (walk xexpanded e se dest ldest h ln tl?))
    607607
    608608                     ((##sys#hash-table-ref inline-table name)
    609609                      => (lambda (val)
    610                            (walk (cons val (cdr x)) e se dest ldest h ln)))
     610                           (walk (cons val (cdr x)) e se dest ldest h ln #f)))
    611611
    612612                     (else
    613613                      (case name
    614614
    615615                        ((##core#if)
    616616                         `(if
    617                            ,(walk (cadr x) e se #f #f h ln)
    618                            ,(walk (caddr x) e se #f #f h ln)
     617                           ,(walk (cadr x) e se #f #f h ln #f)
     618                           ,(walk (caddr x) e se #f #f h ln #f)
    619619                           ,(if (null? (cdddr x))
    620620                                '(##core#undefined)
    621                                 (walk (cadddr x) e se #f #f h ln) ) ) )
     621                                (walk (cadddr x) e se #f #f h ln #f) ) ) )
    622622
    623623                        ((##core#syntax ##core#quote)
    624624                         `(quote ,(strip-syntax (cadr x))))
     
    626626                        ((##core#check)
    627627                         (if unsafe
    628628                             ''#t
    629                              (walk (cadr x) e se dest ldest h ln) ) )
     629                             (walk (cadr x) e se dest ldest h ln tl?) ) )
    630630
    631631                        ((##core#the)
    632632                         `(##core#the
    633633                           ,(strip-syntax (cadr x))
    634634                           ,(caddr x)
    635                            ,(walk (cadddr x) e se dest ldest h ln)))
     635                           ,(walk (cadddr x) e se dest ldest h ln tl?)))
    636636
    637637                        ((##core#typecase)
    638638                         `(##core#typecase
    639639                           ,(or ln (cadr x))
    640                            ,(walk (caddr x) e se #f #f h ln)
     640                           ,(walk (caddr x) e se #f #f h ln tl?)
    641641                           ,@(map (lambda (cl)
    642642                                    (list (strip-syntax (car cl))
    643                                           (walk (cadr cl) e se dest ldest h ln)))
     643                                          (walk (cadr cl) e se dest ldest h ln tl?)))
    644644                                  (cdddr x))))
    645645
    646646                        ((##core#immutable)
     
    667667                        ((##core#inline_loc_ref)
    668668                         `(##core#inline_loc_ref
    669669                           ,(strip-syntax (cadr x))
    670                            ,(walk (caddr x) e se dest ldest h ln)))
     670                           ,(walk (caddr x) e se dest ldest h ln #f)))
    671671
    672672                        ((##core#require-for-syntax)
    673673                         (load-extension (cadr x))
     
    683683                                file-requirements type
    684684                                (cut lset-adjoin/eq? <> id)
    685685                                (cut list id)))
    686                              (walk exp e se dest ldest h ln))))
     686                             (walk exp e se dest ldest h ln #f))))
    687687
    688688                        ((##core#let)
    689689                         (let* ((bindings (cadr x))
     
    693693                           (set-real-names! aliases vars)
    694694                           `(let
    695695                             ,(map (lambda (alias b)
    696                                      (list alias (walk (cadr b) e se (car b) #t h ln)) )
     696                                     (list alias (walk (cadr b) e se (car b) #t h ln #f)) )
    697697                                   aliases bindings)
    698698                             ,(walk (##sys#canonicalize-body
    699699                                     (cddr x) se2 compiler-syntax-enabled)
    700700                                    (append aliases e)
    701                                     se2 dest ldest h ln) ) )  )
     701                                    se2 dest ldest h ln #f) ) )  )
    702702
    703703                        ((##core#letrec*)
    704704                         (let ((bindings (cadr x))
     
    712712                                       `(##core#set! ,(car b) ,(cadr b)))
    713713                                     bindings)
    714714                              (##core#let () ,@body) )
    715                             e se dest ldest h ln)))
     715                            e se dest ldest h ln #f)))
    716716
    717717                        ((##core#letrec)
    718718                         (let* ((bindings (cadr x))
     
    730730                                        `(##core#set! ,v ,t))
    731731                                      vars tmps)
    732732                               (##core#let () ,@body) ) )
    733                             e se dest ldest h ln)))
     733                            e se dest ldest h ln #f)))
    734734
    735735                        ((##core#lambda)
    736736                         (let ((llist (cadr x))
     
    753753                                                  (##core#debug-event "C_DEBUG_ENTRY" ',dest)
    754754                                                  ,body0)
    755755                                                body0)
    756                                             (append aliases e) se2 #f #f dest ln))
     756                                            (append aliases e) se2 #f #f dest ln #f))
    757757                                     (llist2
    758758                                      (build-lambda-list
    759759                                       aliases argc
     
    790790                           (walk
    791791                            (##sys#canonicalize-body (cddr x) se2 compiler-syntax-enabled)
    792792                            e se2
    793                             dest ldest h ln) ) )
     793                            dest ldest h ln #f) ) )
    794794
    795795                       ((##core#letrec-syntax)
    796796                        (let* ((ms (map (lambda (b)
     
    808808                           ms)
    809809                          (walk
    810810                           (##sys#canonicalize-body (cddr x) se2 compiler-syntax-enabled)
    811                            e se2 dest ldest h ln)))
     811                           e se2 dest ldest h ln #f)))
    812812
    813813                       ((##core#define-syntax)
    814814                        (##sys#check-syntax
     
    833833                                 ',var
    834834                                 (##sys#current-environment) ,body) ;XXX possibly wrong se?
    835835                               '(##core#undefined) )
    836                            e se dest ldest h ln)) )
     836                           e se dest ldest h ln #f)) )
    837837
    838838                       ((##core#define-compiler-syntax)
    839839                        (let* ((var (cadr x))
     
    865865                                         ',var)
    866866                                        (##sys#current-environment))))
    867867                               '(##core#undefined) )
    868                            e se dest ldest h ln)))
     868                           e se dest ldest h ln #f)))
    869869
    870870                       ((##core#let-compiler-syntax)
    871871                        (let ((bs (map
     
    892892                                (walk
    893893                                 (##sys#canonicalize-body
    894894                                  (cddr x) se compiler-syntax-enabled)
    895                                  e se dest ldest h ln) )
     895                                 e se dest ldest h ln tl?) )
    896896                              (lambda ()
    897897                                (for-each
    898898                                 (lambda (b)
     
    907907                           (cadr x)
    908908                           (caddr x)
    909909                           (lambda (forms)
    910                              (walk `(##core#begin ,@forms) e se dest ldest h ln)))))
     910                             (walk `(##core#begin ,@forms) e se dest ldest h ln tl?)))))
    911911
    912912                       ((##core#let-module-alias)
    913913                        (##sys#with-module-aliases
     
    916916                                (strip-syntax b))
    917917                              (cadr x))
    918918                         (lambda ()
    919                            (walk `(##core#begin ,@(cddr x)) e se dest ldest h ln))))
     919                           (walk `(##core#begin ,@(cddr x)) e se dest ldest h ln #t))))
    920920
    921921                       ((##core#module)
    922922                        (let* ((name (strip-syntax (cadr x)))
     
    986986                                                         (car body)
    987987                                                         e ;?
    988988                                                         (##sys#current-environment)
    989                                                          #f #f h ln)
     989                                                         #f #f h ln #t) ; reset to toplevel!
    990990                                                        xs))))))))))
    991991                            (let ((body
    992992                                   (canonicalize-begin-body
     
    999999                                          (walk
    10001000                                           x
    10011001                                           e ;?
    1002                                            (##sys#current-meta-environment) #f #f h ln) )
     1002                                           (##sys#current-meta-environment) #f #f h ln tl?) )
    10031003                                        (cons `(##core#provide ,req) module-registration)))
    10041004                                      body))))
    10051005                              (do ((cs compiler-syntax (cdr cs)))
     
    10171017                                (walk
    10181018                                 (##sys#canonicalize-body obody se2 compiler-syntax-enabled)
    10191019                                 (append aliases e)
    1020                                  se2 #f #f dest ln) ] )
     1020                                 se2 #f #f dest ln #f) ] )
    10211021                          (set-real-names! aliases vars)
    10221022                          `(##core#lambda ,aliases ,body) ) )
    10231023
     
    10391039                                              (##core#inline_update
    10401040                                               (,(third fv) ,type)
    10411041                                               ,(foreign-type-check tmp type) ) )
    1042                                            e se #f #f h ln))))
     1042                                           e se #f #f h ln #f))))
    10431043                                 ((assq var location-pointer-map)
    10441044                                  => (lambda (a)
    10451045                                       (let* ([type (third a)]
     
    10501050                                              (,type)
    10511051                                              ,(second a)
    10521052                                              ,(foreign-type-check tmp type) ) )
    1053                                           e se #f #f h ln))))
     1053                                          e se #f #f h ln #f))))
    10541054                                 (else
    10551055                                  (unless (memq var e) ; global?
    10561056                                    (set! var (or (##sys#get var '##core#primitive)
     
    10741074                                         (##sys#notice "assignment to imported value binding" var)))
    10751075                                  (when (keyword? var)
    10761076                                    (warning (sprintf "assignment to keyword `~S'" var) ))
    1077                                   `(set! ,var ,(walk val e se var0 (memq var e) h ln))))))
     1077                                  `(set! ,var ,(walk val e se var0 (memq var e) h ln #f))))))
    10781078
    10791079                        ((##core#debug-event)
    10801080                         `(##core#debug-event
    10811081                           ,(unquotify (cadr x) se)
    10821082                           ,ln ; this arg is added - from this phase on ##core#debug-event has an additional argument!
    10831083                           ,@(map (lambda (arg)
    1084                                     (unquotify (walk arg e se #f #f h ln) se))
     1084                                    (unquotify (walk arg e se #f #f h ln tl?) se))
    10851085                                  (cddr x))))
    10861086
    10871087                        ((##core#inline)
    10881088                         `(##core#inline
    1089                            ,(unquotify (cadr x) se) ,@(mapwalk (cddr x) e se h ln)))
     1089                           ,(unquotify (cadr x) se) ,@(mapwalk (cddr x) e se h ln #f)))
    10901090
    10911091                        ((##core#inline_allocate)
    10921092                         `(##core#inline_allocate
    10931093                           ,(map (cut unquotify <> se) (second x))
    1094                            ,@(mapwalk (cddr x) e se h ln)))
     1094                           ,@(mapwalk (cddr x) e se h ln #f)))
    10951095
    10961096                        ((##core#inline_update)
    1097                          `(##core#inline_update ,(cadr x) ,(walk (caddr x) e se #f #f h ln)) )
     1097                         `(##core#inline_update ,(cadr x) ,(walk (caddr x) e se #f #f h ln #f)) )
    10981098
    10991099                        ((##core#inline_loc_update)
    11001100                         `(##core#inline_loc_update
    11011101                           ,(cadr x)
    1102                            ,(walk (caddr x) e se #f #f h ln)
    1103                            ,(walk (cadddr x) e se #f #f h ln)) )
     1102                           ,(walk (caddr x) e se #f #f h ln #f)
     1103                           ,(walk (cadddr x) e se #f #f h ln #f)) )
    11041104
    11051105                        ((##core#compiletimetoo ##core#elaborationtimetoo)
    11061106                         (let ((exp (cadr x)))
    11071107                           (##sys#eval/meta exp)
    1108                            (walk exp e se dest #f h ln) ) )
     1108                           (walk exp e se dest #f h ln tl?) ) )
    11091109
    11101110                        ((##core#compiletimeonly ##core#elaborationtimeonly)
    11111111                         (##sys#eval/meta (cadr x))
     
    11181118                                (let ([x (car xs)]
    11191119                                      [r (cdr xs)] )
    11201120                                  (if (null? r)
    1121                                       (list (walk x e se dest ldest h ln))
    1122                                       (cons (walk x e se #f #f h ln) (fold r)) ) ) ) )
     1121                                      (list (walk x e se dest ldest h ln tl?))
     1122                                      (cons (walk x e se #f #f h ln tl?) (fold r)) ) ) ) )
    11231123                             '(##core#undefined) ) )
    11241124
    11251125                        ((##core#foreign-lambda)
    1126                          (walk (expand-foreign-lambda x #f) e se dest ldest h ln) )
     1126                         (walk (expand-foreign-lambda x #f) e se dest ldest h ln #f) )
    11271127
    11281128                        ((##core#foreign-safe-lambda)
    1129                          (walk (expand-foreign-lambda x #t) e se dest ldest h ln) )
     1129                         (walk (expand-foreign-lambda x #t) e se dest ldest h ln #f) )
    11301130
    11311131                        ((##core#foreign-lambda*)
    1132                          (walk (expand-foreign-lambda* x #f) e se dest ldest h ln) )
     1132                         (walk (expand-foreign-lambda* x #f) e se dest ldest h ln #f) )
    11331133
    11341134                        ((##core#foreign-safe-lambda*)
    1135                          (walk (expand-foreign-lambda* x #t) e se dest ldest h ln) )
     1135                         (walk (expand-foreign-lambda* x #t) e se dest ldest h ln #f) )
    11361136
    11371137                        ((##core#foreign-primitive)
    1138                          (walk (expand-foreign-primitive x) e se dest ldest h ln) )
     1138                         (walk (expand-foreign-primitive x) e se dest ldest h ln #f) )
    11391139
    11401140                        ((##core#define-foreign-variable)
    11411141                         (let* ((var (strip-syntax (second x)))
     
    11691169                                        (define
    11701170                                         ,ret
    11711171                                         ,(if (pair? (cdr conv)) (second conv) '##sys#values)) )
    1172                                      e se dest ldest h ln) ) ]
     1172                                     e se dest ldest h ln #f) ) ]
    11731173                                 [else
    11741174                                  (register-foreign-type! name type)
    11751175                                  '(##core#undefined) ] ) ) )
     
    12121212                                      '() )
    12131213                                ,(if init (fifth x) (fourth x)) ) )
    12141214                            e (alist-cons var alias se)
    1215                             dest ldest h ln) ) )
     1215                            dest ldest h ln #f) ) )
    12161216
    12171217                        ((##core#define-inline)
    12181218                         (let* ((name (second x))
     
    12441244                                    (hide-variable var)
    12451245                                    (mark-variable var '##compiler#constant)
    12461246                                    (mark-variable var '##compiler#always-bound)
    1247                                     (walk `(define ,var (##core#quote ,val)) e se #f #f h ln)))
     1247                                    (walk `(define ,var (##core#quote ,val)) e se #f #f h ln tl?)))
    12481248                                 (else
    12491249                                  (quit-compiling "invalid compile-time value for named constant `~S'"
    12501250                                        name)))))
     
    12581258                                       (lambda (id)
    12591259                                         (memq (lookup id se) e))))
    12601260                                    (cdr x) ) )
    1261                           e '() #f #f h ln) )
     1261                          e '() #f #f h ln #f) )
    12621262
    12631263                        ((##core#foreign-callback-wrapper)
    12641264                         (let-values ([(args lam) (split-at (cdr x) 4)])
     
    12801280                                "non-matching or invalid argument list to foreign callback-wrapper"
    12811281                                vars atypes) )
    12821282                             `(##core#foreign-callback-wrapper
    1283                                ,@(mapwalk args e se h ln)
     1283                               ,@(mapwalk args e se h ln #f)
    12841284                               ,(walk `(##core#lambda
    12851285                                        ,vars
    12861286                                        (##core#let
     
    13371337                                                     (##sys#make-c-string r ',name)) ) ) )
    13381338                                                (else (cddr lam)) ) )
    13391339                                           rtype) ) )
    1340                                       e se #f #f h ln) ) ) ) )
     1340                                      e se #f #f h ln #f) ) ) ) )
    13411341
    13421342                        ((##core#location)
    13431343                         (let ([sym (cadr x)])
     
    13461346                                      => (lambda (a)
    13471347                                           (walk
    13481348                                            `(##sys#make-locative ,(second a) 0 #f 'location)
    1349                                             e se #f #f h ln) ) ]
     1349                                            e se #f #f h ln #f) ) ]
    13501350                                     [(assq sym external-to-pointer)
    1351                                       => (lambda (a) (walk (cdr a) e se #f #f h ln)) ]
     1351                                      => (lambda (a) (walk (cdr a) e se #f #f h ln #f)) ]
    13521352                                     [(assq sym callback-names)
    13531353                                      `(##core#inline_ref (,(symbol->string sym) c-pointer)) ]
    13541354                                     [else
    13551355                                      (walk
    13561356                                       `(##sys#make-locative ,sym 0 #f 'location)
    1357                                        e se #f #f h ln) ] )
     1357                                       e se #f #f h ln #f) ] )
    13581358                               (walk
    13591359                                `(##sys#make-locative ,sym 0 #f 'location)
    1360                                 e se #f #f h ln) ) ) )
     1360                                e se #f #f h ln #f) ) ) )
    13611361
    13621362                        (else
    13631363                         (let* ((x2 (fluid-let ((##sys#syntax-context
    13641364                                                 (cons name ##sys#syntax-context)))
    1365                                       (mapwalk x e se h ln)))
     1365                                      (mapwalk x e se h ln tl?)))
    13661366                                (head2 (car x2))
    13671367                                (old (##sys#hash-table-ref line-number-database-2 head2)) )
    13681368                           (when ln
     
    13781378          ((constant? (car x))
    13791379           (emit-syntax-trace-info x #f)
    13801380           (warning "literal in operator position" x)
    1381            (mapwalk x e se h outer-ln) )
     1381           (mapwalk x e se h outer-ln tl?) )
    13821382
    13831383          (else
    13841384           (emit-syntax-trace-info x #f)
     
    13871387              `(##core#let
    13881388                ((,tmp ,(car x)))
    13891389                (,tmp ,@(cdr x)))
    1390               e se dest ldest h outer-ln)))))
     1390              e se dest ldest h outer-ln #f)))))
    13911391
    1392   (define (mapwalk xs e se h ln)
    1393     (map (lambda (x) (walk x e se #f #f h ln)) xs) )
     1392  (define (mapwalk xs e se h ln tl?)
     1393    (map (lambda (x) (walk x e se #f #f h ln tl?)) xs) )
    13941394
    13951395  (when (memq 'c debugging-chicken) (newline) (pretty-print exp))
    13961396  (foreign-code "C_clear_trace_buffer();")
     
    14031403     ,(begin
    14041404        (set! extended-bindings (append internal-bindings extended-bindings))
    14051405        exp) )
    1406    '() (##sys#current-environment) #f #f #f #f) ) )
     1406   '() (##sys#current-environment) #f #f #f #f #t) ) )
    14071407
    14081408
    14091409(define (process-declaration spec se local?)
  • eval.scm

    diff --git a/eval.scm b/eval.scm
    index c43e444..bddc5f3 100644
    a b  
    207207
    208208(define compile-to-closure
    209209  (let ((reverse reverse))
    210     (lambda (exp env se #!optional cntr evalenv static)
     210    (lambda (exp env se #!optional cntr evalenv static tl?)
    211211
    212212      (define (find-id id se)           ; ignores macro bindings
    213213        (cond ((null? se) #f)
     
    252252      (define (decorate p ll h cntr)
    253253        (eval-decorator p ll h cntr))
    254254
    255       (define (compile x e h tf cntr se)
     255      (define (compile x e h tf cntr se tl?)
    256256        (cond ((keyword? x) (lambda v x))
    257257              ((symbol? x)
    258258               (receive (i j) (lookup x e se)
     
    315315               (##sys#syntax-error/context "illegal non-atomic object" x)]
    316316              [(symbol? (##sys#slot x 0))
    317317               (emit-syntax-trace-info tf x cntr)
    318                (let ((x2 (expand x se)))
     318               (let ((x2 (expand x se #f tl?)))
    319319                 (d `(EVAL/EXPANDED: ,x2))
    320320                 (if (not (eq? x2 x))
    321                      (compile x2 e h tf cntr se)
     321                     (compile x2 e h tf cntr se tl?)
    322322                     (let ((head (rename (##sys#slot x 0) se)))
    323323                       ;; here we did't resolve ##core#primitive, but that is done in compile-call (via
    324324                       ;; a normal walking of the operator)
     
    341341                            (lambda v c)))
    342342
    343343                         [(##core#check)
    344                           (compile (cadr x) e h tf cntr se) ]
     344                          (compile (cadr x) e h tf cntr se #f) ]
    345345
    346346                         [(##core#immutable)
    347                           (compile (cadr x) e #f tf cntr se) ]
     347                          (compile (cadr x) e #f tf cntr se #f) ]
    348348                   
    349349                         [(##core#undefined) (lambda (v) (##core#undefined))]
    350350
    351351                         [(##core#if)
    352                           (let* ([test (compile (cadr x) e #f tf cntr se)]
    353                                  [cns (compile (caddr x) e #f tf cntr se)]
    354                                  [alt (if (pair? (cdddr x))
    355                                           (compile (cadddr x) e #f tf cntr se)
    356                                           (compile '(##core#undefined) e #f tf cntr se) ) ] )
     352                          (let* ((test (compile (cadr x) e #f tf cntr se #f))
     353                                 (cns (compile (caddr x) e #f tf cntr se #f))
     354                                 (alt (if (pair? (cdddr x))
     355                                          (compile (cadddr x) e #f tf cntr se #f)
     356                                          (compile '(##core#undefined) e #f tf cntr se #f) ) ) )
    357357                            (lambda (v) (if (##core#app test v) (##core#app cns v) (##core#app alt v))) ) ]
    358358
    359359                         [(##core#begin)
    360360                          (let* ((body (##sys#slot x 1))
    361361                                 (len (length body)) )
    362362                            (case len
    363                               [(0) (compile '(##core#undefined) e #f tf cntr se)]
    364                               [(1) (compile (##sys#slot body 0) e #f tf cntr se)]
    365                               [(2) (let* ([x1 (compile (##sys#slot body 0) e #f tf cntr se)]
    366                                           [x2 (compile (cadr body) e #f tf cntr se)] )
    367                                      (lambda (v) (##core#app x1 v) (##core#app x2 v)) ) ]
    368                               [else
    369                                (let* ([x1 (compile (##sys#slot body 0) e #f tf cntr se)]
    370                                       [x2 (compile (cadr body) e #f tf cntr se)]
    371                                       [x3 (compile `(##core#begin ,@(##sys#slot (##sys#slot body 1) 1)) e #f tf cntr se)] )
    372                                  (lambda (v) (##core#app x1 v) (##core#app x2 v) (##core#app x3 v)) ) ] ) ) ]
     363                              ((0) (compile '(##core#undefined) e #f tf cntr se tl?))
     364                              ((1) (compile (##sys#slot body 0) e #f tf cntr se tl?))
     365                              ((2) (let* ([x1 (compile (##sys#slot body 0) e #f tf cntr se tl?)]
     366                                          [x2 (compile (cadr body) e #f tf cntr se tl?)] )
     367                                     (lambda (v) (##core#app x1 v) (##core#app x2 v)) ) )
     368                              (else
     369                               (let* ([x1 (compile (##sys#slot body 0) e #f tf cntr se tl?)]
     370                                      [x2 (compile (cadr body) e #f tf cntr se tl?)]
     371                                      [x3 (compile `(##core#begin ,@(##sys#slot (##sys#slot body 1) 1)) e #f tf cntr se tl?)] )
     372                                 (lambda (v) (##core#app x1 v) (##core#app x2 v) (##core#app x3 v)) ) ) ) ) ]
    373373
    374374                         [(##core#set!)
    375375                          (let ((var (cadr x)))
    376376                            (receive (i j) (lookup var e se)
    377                               (let ((val (compile (caddr x) e var tf cntr se)))
     377                              (let ((val (compile (caddr x) e var tf cntr se #f)))
    378378                                (cond [(not i)
    379379                                       (when ##sys#notices-enabled
    380380                                         (and-let* ((a (assq var (##sys#current-environment)))
     
    406406                                 (se2 (##sys#extend-se se vars aliases))
    407407                                 [body (compile-to-closure
    408408                                        (##sys#canonicalize-body (cddr x) se2 #f)
    409                                         e2 se2 cntr evalenv static) ] )
     409                                        e2 se2 cntr evalenv static #f) ] )
    410410                            (case n
    411                               [(1) (let ([val (compile (cadar bindings) e (car vars) tf cntr se)])
     411                              [(1) (let ([val (compile (cadar bindings) e (car vars) tf cntr se #f)])
    412412                                     (lambda (v)
    413413                                       (##core#app body (cons (vector (##core#app val v)) v)) ) ) ]
    414                               [(2) (let ([val1 (compile (cadar bindings) e (car vars) tf cntr se)]
    415                                          [val2 (compile (cadadr bindings) e (cadr vars) tf cntr se)] )
     414                              [(2) (let ([val1 (compile (cadar bindings) e (car vars) tf cntr se #f)]
     415                                         [val2 (compile (cadadr bindings) e (cadr vars) tf cntr se #f)] )
    416416                                     (lambda (v)
    417417                                       (##core#app body (cons (vector (##core#app val1 v) (##core#app val2 v)) v)) ) ) ]
    418                               [(3) (let* ([val1 (compile (cadar bindings) e (car vars) tf cntr se)]
    419                                           [val2 (compile (cadadr bindings) e (cadr vars) tf cntr se)]
     418                              [(3) (let* ([val1 (compile (cadar bindings) e (car vars) tf cntr se #f)]
     419                                          [val2 (compile (cadadr bindings) e (cadr vars) tf cntr se #f)]
    420420                                          [t (cddr bindings)]
    421                                           [val3 (compile (cadar t) e (caddr vars) tf cntr se)] )
     421                                          [val3 (compile (cadar t) e (caddr vars) tf cntr se #f)] )
    422422                                     (lambda (v)
    423423                                       (##core#app
    424424                                        body
    425425                                        (cons (vector (##core#app val1 v) (##core#app val2 v) (##core#app val3 v)) v)) ) ) ]
    426                               [(4) (let* ([val1 (compile (cadar bindings) e (car vars) tf cntr se)]
    427                                           [val2 (compile (cadadr bindings) e (cadr vars) tf cntr se)]
     426                              [(4) (let* ([val1 (compile (cadar bindings) e (car vars) tf cntr se #f)]
     427                                          [val2 (compile (cadadr bindings) e (cadr vars) tf cntr se #f)]
    428428                                          [t (cddr bindings)]
    429                                           [val3 (compile (cadar t) e (caddr vars) tf cntr se)]
    430                                           [val4 (compile (cadadr t) e (cadddr vars) tf cntr se)] )
     429                                          [val3 (compile (cadar t) e (caddr vars) tf cntr se #f)]
     430                                          [val4 (compile (cadadr t) e (cadddr vars) tf cntr se #f)] )
    431431                                     (lambda (v)
    432432                                       (##core#app
    433433                                        body
     
    437437                                                      (##core#app val4 v))
    438438                                              v)) ) ) ]
    439439                              [else
    440                                (let ([vals (map (lambda (x) (compile (cadr x) e (car x) tf cntr se)) bindings)])
     440                               (let ((vals (map (lambda (x) (compile (cadr x) e (car x) tf cntr se #f)) bindings)))
    441441                                 (lambda (v)
    442442                                   (let ([v2 (##sys#make-vector n)])
    443443                                     (do ([i 0 (fx+ i 1)]
     
    458458                                              `(##core#set! ,(car b) ,(cadr b)))
    459459                                            bindings)
    460460                               (##core#let () ,@body) )
    461                              e h tf cntr se)))
     461                             e h tf cntr se #f)))
    462462
    463463                        ((##core#letrec)
    464464                         (let* ((bindings (cadr x))
     
    475475                                                   `(##core#set! ,v ,t))
    476476                                                 vars tmps)
    477477                                          (##core#let () ,@body) ) )
    478                               e h tf cntr se)))
     478                              e h tf cntr se #f)))
    479479
    480480                         [(##core#lambda)
    481481                          (##sys#check-syntax 'lambda x '(_ lambda-list . #(_ 1)) #f se)
     
    496496                                      (body
    497497                                       (compile-to-closure
    498498                                        (##sys#canonicalize-body body se2 #f)
    499                                         e2 se2 (or h cntr) evalenv static) ) )
     499                                        e2 se2 (or h cntr) evalenv static #f) ) )
    500500                                 (case argc
    501501                                   [(0) (if rest
    502502                                            (lambda (v)
     
    583583                                      se) ) )
    584584                            (compile
    585585                             (##sys#canonicalize-body (cddr x) se2 #f)
    586                              e #f tf cntr se2)))
     586                             e #f tf cntr se2 #f)))
    587587                               
    588588                         ((##core#letrec-syntax)
    589589                          (let* ((ms (map (lambda (b)
     
    601601                             ms)
    602602                            (compile
    603603                             (##sys#canonicalize-body (cddr x) se2 #f)
    604                              e #f tf cntr se2)))
     604                             e #f tf cntr se2 #f)))
    605605                               
    606606                         ((##core#define-syntax)
    607607                          (let* ((var (cadr x))
     
    616616                             name
    617617                             (##sys#current-environment)
    618618                             (##sys#eval/meta body))
    619                             (compile '(##core#undefined) e #f tf cntr se) ) )
     619                            (compile '(##core#undefined) e #f tf cntr se #f) ) )
    620620
    621621                         ((##core#define-compiler-syntax)
    622                           (compile '(##core#undefined) e #f tf cntr se))
     622                          (compile '(##core#undefined) e #f tf cntr se #f))
    623623
    624624                         ((##core#let-compiler-syntax)
    625625                          (compile
    626626                           (##sys#canonicalize-body (cddr x) se #f)
    627                            e #f tf cntr se))
     627                           e #f tf cntr se #f))
    628628
    629629                         ((##core#include)
    630630                          (##sys#include-forms-from-file
    631631                           (cadr x)
    632632                           (caddr x)
    633633                           (lambda (forms)
    634                              (compile `(##core#begin ,@forms) e #f tf cntr se))))
     634                             (compile `(##core#begin ,@forms) e #f tf cntr se tl?))))
    635635
    636636                         ((##core#let-module-alias)
    637637                          (##sys#with-module-aliases
     
    640640                                  (strip-syntax b))
    641641                                (cadr x))
    642642                           (lambda ()
    643                              (compile `(##core#begin ,@(cddr x)) e #f tf cntr se))))
     643                             (compile `(##core#begin ,@(cddr x)) e #f tf cntr se tl?))))
    644644
    645645                         ((##core#module)
    646646                          (let* ((x (strip-syntax x))
     
    691691                                        (cons (compile
    692692                                               (car body)
    693693                                               '() #f tf cntr
    694                                                (##sys#current-environment))
     694                                               (##sys#current-environment)
     695                                               #t) ; reset back to toplevel!
    695696                                              xs))))) ) )))
    696697
    697698                         [(##core#loop-lambda)
    698                           (compile `(,(rename 'lambda se) ,@(cdr x)) e #f tf cntr se) ]
     699                          (compile `(,(rename 'lambda se) ,@(cdr x)) e #f tf cntr se #f) ]
    699700
    700701                         [(##core#provide)
    701                           (compile `(##sys#provide (##core#quote ,(cadr x))) e #f tf cntr se)]
     702                          (compile `(##sys#provide (##core#quote ,(cadr x))) e #f tf cntr se #f)]
    702703
    703704                         [(##core#require-for-syntax)
    704705                          (let ((id (cadr x)))
     
    708709                               ,@(map (lambda (x)
    709710                                        `(##sys#load-extension (##core#quote ,x)))
    710711                                      (lookup-runtime-requirements id)))
    711                              e #f tf cntr se))]
     712                             e #f tf cntr se #f))]
    712713
    713714                         [(##core#require)
    714715                          (let ((id         (cadr x))
    715716                                (alternates (cddr x)))
    716717                            (let-values (((exp _ _) (##sys#process-require id #f alternates)))
    717                               (compile exp e #f tf cntr se)))]
     718                              (compile exp e #f tf cntr se #f)))]
    718719
    719720                         [(##core#elaborationtimeonly ##core#elaborationtimetoo) ; <- Note this!
    720721                          (##sys#eval/meta (cadr x))
    721                           (compile '(##core#undefined) e #f tf cntr se) ]
     722                          (compile '(##core#undefined) e #f tf cntr se tl?) ]
    722723
    723724                         [(##core#compiletimetoo)
    724                           (compile (cadr x) e #f tf cntr se) ]
     725                          (compile (cadr x) e #f tf cntr se tl?) ]
    725726
    726727                         [(##core#compiletimeonly ##core#callunit)
    727                           (compile '(##core#undefined) e #f tf cntr se) ]
     728                          (compile '(##core#undefined) e #f tf cntr se tl?) ]
    728729
    729730                         [(##core#declare)
    730731                          (##sys#notice "declarations are ignored in interpreted code" x)
    731                           (compile '(##core#undefined) e #f tf cntr se) ]
     732                          (compile '(##core#undefined) e #f tf cntr se #f) ]
    732733
    733734                         [(##core#define-inline ##core#define-constant)
    734                           (compile `(,(rename 'define se) ,@(cdr x)) e #f tf cntr se) ]
     735                          (compile `(,(rename 'define se) ,@(cdr x)) e #f tf cntr se #f) ]
    735736                   
    736737                         [(##core#primitive ##core#inline ##core#inline_allocate ##core#foreign-lambda
    737738                                            ##core#define-foreign-variable
     
    744745                          (compile-call (cdr x) e tf cntr se) ]
    745746
    746747                         ((##core#the)
    747                           (compile (cadddr x) e h tf cntr se))
     748                          (compile (cadddr x) e h tf cntr se tl?))
    748749                         
    749750                         ((##core#typecase)
    750751                          ;; drops exp and requires "else" clause
    751752                          (cond ((assq 'else (strip-syntax (cdddr x))) =>
    752753                                 (lambda (cl)
    753                                    (compile (cadr cl) e h tf cntr se)))
     754                                   (compile (cadr cl) e h tf cntr se tl?)))
    754755                                (else
    755756                                 (##sys#syntax-error-hook
    756757                                  'compiler-typecase
     
    789790        (let* ((head (##sys#slot x 0))
    790791               (fn (if (procedure? head)
    791792                       (lambda _ head)
    792                        (compile (##sys#slot x 0) e #f tf cntr se)))
     793                       (compile (##sys#slot x 0) e #f tf cntr se #f)))
    793794               (args (##sys#slot x 1))
    794795               (argc (checked-length args))
    795796               (info x) )
     
    798799            [(0) (lambda (v)
    799800                   (emit-trace-info tf info cntr e v)
    800801                   ((##core#app fn v)))]
    801             [(1) (let ([a1 (compile (##sys#slot args 0) e #f tf cntr se)])
     802            [(1) (let ((a1 (compile (##sys#slot args 0) e #f tf cntr se #f)))
    802803                   (lambda (v)
    803804                     (emit-trace-info tf info cntr e v)
    804805                     ((##core#app fn v) (##core#app a1 v))) ) ]
    805             [(2) (let* ([a1 (compile (##sys#slot args 0) e #f tf cntr se)]
    806                         [a2 (compile (##core#inline "C_u_i_list_ref" args 1) e #f tf cntr se)] )
     806            [(2) (let* ((a1 (compile (##sys#slot args 0) e #f tf cntr se #f))
     807                        (a2 (compile (##core#inline "C_u_i_list_ref" args 1) e #f tf cntr se #f)) )
    807808                   (lambda (v)
    808809                     (emit-trace-info tf info cntr e v)
    809810                     ((##core#app fn v) (##core#app a1 v) (##core#app a2 v))) ) ]
    810             [(3) (let* ([a1 (compile (##sys#slot args 0) e #f tf cntr se)]
    811                         [a2 (compile (##core#inline "C_u_i_list_ref" args 1) e #f tf cntr se)]
    812                         [a3 (compile (##core#inline "C_u_i_list_ref" args 2) e #f tf cntr se)] )
     811            [(3) (let* ((a1 (compile (##sys#slot args 0) e #f tf cntr se #f))
     812                        (a2 (compile (##core#inline "C_u_i_list_ref" args 1) e #f tf cntr se #f))
     813                        (a3 (compile (##core#inline "C_u_i_list_ref" args 2) e #f tf cntr se #f)) )
    813814                   (lambda (v)
    814815                     (emit-trace-info tf info cntr e v)
    815816                     ((##core#app fn v) (##core#app a1 v) (##core#app a2 v) (##core#app a3 v))) ) ]
    816             [(4) (let* ([a1 (compile (##sys#slot args 0) e #f tf cntr se)]
    817                         [a2 (compile (##core#inline "C_u_i_list_ref" args 1) e #f tf cntr se)]
    818                         [a3 (compile (##core#inline "C_u_i_list_ref" args 2) e #f tf cntr se)]
    819                         [a4 (compile (##core#inline "C_u_i_list_ref" args 3) e #f tf cntr se)] )
     817            [(4) (let* ((a1 (compile (##sys#slot args 0) e #f tf cntr se #f))
     818                        (a2 (compile (##core#inline "C_u_i_list_ref" args 1) e #f tf cntr se #f))
     819                        (a3 (compile (##core#inline "C_u_i_list_ref" args 2) e #f tf cntr se #f))
     820                        (a4 (compile (##core#inline "C_u_i_list_ref" args 3) e #f tf cntr se #f)) )
    820821                   (lambda (v)
    821822                     (emit-trace-info tf info cntr e v)
    822823                     ((##core#app fn v) (##core#app a1 v) (##core#app a2 v) (##core#app a3 v) (##core#app a4 v))) ) ]
    823             [else (let ([as (##sys#map (lambda (a) (compile a e #f tf cntr se)) args)])
     824            [else (let ((as (##sys#map (lambda (a) (compile a e #f tf cntr se #f)) args)))
    824825                    (lambda (v)
    825826                      (emit-trace-info tf info cntr e v)
    826827                      (apply (##core#app fn v) (##sys#map (lambda (a) (##core#app a v)) as))) ) ] ) ) )
    827828
    828       (compile exp env #f (fx> (##sys#eval-debug-level) 0) cntr se) ) ) )
     829      (compile exp env #f (fx> (##sys#eval-debug-level) 0) cntr se tl?) ) ) )
    829830
    830831
    831832;;; evaluate in the macro-expansion/compile-time environment
     
    846847          ((compile-to-closure
    847848            form
    848849            '()
    849             (##sys#current-meta-environment)) ;XXX evalenv? static?
    850            '() ) )
     850            (##sys#current-meta-environment)
     851            #f #f #f                    ;XXX evalenv? static?
     852            #t)                         ; toplevel.
     853           '()) )
    851854        (lambda ()
    852855          (##sys#active-eval-environment aee)
    853856          (##sys#current-module oldcm)
     
    865868              (let ((se2 (##sys#slot env 2)))
    866869                ((if se2                ; not interaction-environment?
    867870                     (parameterize ((##sys#macro-environment '()))
    868                        (compile-to-closure x '() se2 #f env (##sys#slot env 3)))
    869                      (compile-to-closure x '() se #f env #f))
     871                       (compile-to-closure x '() se2 #f env (##sys#slot env 3) #t))
     872                     (compile-to-closure x '() se #f env #f #t))
    870873                 '() ) ) )
    871874             (else
    872               ((compile-to-closure x '() se #f #f #f) '())))))))
     875              ((compile-to-closure x '() se #f #f #f #t) '())))))))
    873876
    874877(define (eval x . env)
    875878  (apply (eval-handler) x env))
  • expand.scm

    diff --git a/expand.scm b/expand.scm
    index 783b34d..2548309 100644
    a b  
    209209
    210210;; The basic macro-expander
    211211
    212 (define (##sys#expand-0 exp dse cs?)
     212(define (##sys#expand-0 exp dse cs? toplevel?)
    213213  (define (call-handler name handler exp se cs)
    214214    (dd "invoking macro: " name)
    215215    (dd `(STATIC-SE: ,@(map-se se)))
     
    272272            (call-handler head (cadr mdef) exp (car mdef) #f)
    273273            #t))
    274274          (else (values exp #f)) ) )
    275   (let loop ((exp exp))
    276     (if (pair? exp)
    277       (let ((head (car exp))
    278             (body (cdr exp)) )
    279         (if (symbol? head)
    280             (let ((head2 (or (lookup head dse) head)))
    281               (unless (pair? head2)
    282                 (set! head2 (or (lookup head2 (##sys#macro-environment)) head2)) )
    283               (cond [(eq? head2 '##core#let)
    284                      (##sys#check-syntax 'let body '#(_ 2) #f dse)
    285                      (let ([bindings (car body)])
    286                        (cond [(symbol? bindings) ; expand named let
    287                               (##sys#check-syntax 'let body '(_ #((variable _) 0) . #(_ 1)) #f dse)
    288                               (let ([bs (cadr body)])
    289                                 (values
    290                                  `(##core#app
    291                                    (##core#letrec*
    292                                     ([,bindings
    293                                       (##core#loop-lambda
    294                                        ,(map (lambda (b) (car b)) bs) ,@(cddr body))])
    295                                     ,bindings)
    296                                    ,@(##sys#map cadr bs) )
    297                                  #t) ) ]
    298                              [else (values exp #f)] ) ) ]
    299                     ((and cs? (symbol? head2) (getp head2 '##compiler#compiler-syntax)) =>
    300                      (lambda (cs)
    301                        (let ((result (call-handler head (car cs) exp (cdr cs) #t)))
    302                          (cond ((eq? result exp) (expand head exp head2))
    303                                (else
    304                                 (when ##sys#compiler-syntax-hook
    305                                   (##sys#compiler-syntax-hook head result))
    306                                 (loop result))))))
    307                     [else (expand head exp head2)] ) )
    308             (values exp #f) ) )
    309       (values exp #f) ) ) )
     275  (fluid-let ((##sys#at-toplevel toplevel?))
     276    (let loop ((exp exp))
     277      (if (pair? exp)
     278          (let ((head (car exp))
     279                (body (cdr exp)) )
     280            (if (symbol? head)
     281                (let ((head2 (or (lookup head dse) head)))
     282                  (unless (pair? head2)
     283                    (set! head2 (or (lookup head2 (##sys#macro-environment)) head2)) )
     284                  (cond [(eq? head2 '##core#let)
     285                         (##sys#check-syntax 'let body '#(_ 2) #f dse)
     286                         (let ([bindings (car body)])
     287                           (cond [(symbol? bindings) ; expand named let
     288                                  (##sys#check-syntax 'let body '(_ #((variable _) 0) . #(_ 1)) #f dse)
     289                                  (let ([bs (cadr body)])
     290                                    (values
     291                                     `(##core#app
     292                                       (##core#letrec*
     293                                        ([,bindings
     294                                          (##core#loop-lambda
     295                                           ,(map (lambda (b) (car b)) bs) ,@(cddr body))])
     296                                        ,bindings)
     297                                       ,@(##sys#map cadr bs) )
     298                                     #t) ) ]
     299                                 [else (values exp #f)] ) ) ]
     300                        ((and cs? (symbol? head2) (getp head2 '##compiler#compiler-syntax)) =>
     301                         (lambda (cs)
     302                           (let ((result (call-handler head (car cs) exp (cdr cs) #t)))
     303                             (cond ((eq? result exp) (expand head exp head2))
     304                                   (else
     305                                    (when ##sys#compiler-syntax-hook
     306                                      (##sys#compiler-syntax-hook head result))
     307                                    (loop result))))))
     308                        [else (expand head exp head2)] ) )
     309                (values exp #f) ) )
     310          (values exp #f) ) )) )
    310311
    311312(define ##sys#compiler-syntax-hook #f)
    312313(define ##sys#enable-runtime-macros #f)
     
    315316
    316317;;; User-level macroexpansion
    317318
    318 (define (expand exp #!optional (se (##sys#current-environment)) cs?)
     319(define (expand exp #!optional (se (##sys#current-environment)) cs? (toplevel? #t))
    319320  (let loop ((exp exp))
    320     (let-values (((exp2 m) (##sys#expand-0 exp se cs?)))
     321    (let-values (((exp2 m) (##sys#expand-0 exp se cs? toplevel?)))
    321322      (if m
    322323          (loop exp2)
    323324          exp2) ) ) )
     
    595596                    (else
    596597                     (if (member (list head) vars)
    597598                         (fini vars vals mvars body)
    598                          (let ((x2 (##sys#expand-0 x se cs?)))
     599                         (let ((x2 (##sys#expand-0 x se cs? #f)))
    599600                           (if (eq? x x2)
    600601                               (fini vars vals mvars body)
    601602                               (loop (cons x2 rest)
     
    642643(define ##sys#syntax-error-culprit #f)
    643644(define ##sys#syntax-context '())
    644645
     646;; Used to forbid definitions in expression contexts
     647(define ##sys#at-toplevel #t)
     648
    645649(define (syntax-error . args)
    646650  (apply ##sys#signal-hook #:syntax-error
    647651         (strip-syntax args)))
     
    713717
    714718(define-constant +default-argument-count-limit+ 99999)
    715719
     720(define ##sys#check-toplevel-definition
     721  (lambda (form exp)
     722    (unless ##sys#at-toplevel
     723      (let ((ln (get-line-number exp))
     724            (msg "definition found in expression context"))
     725        (##sys#syntax-error-hook
     726         (if ln
     727             (string-append "(" ln ") in `" (symbol->string form) "' - " msg)
     728             (string-append "in `" (symbol->string form) "' - " msg))
     729         exp)))))
     730
    716731(define ##sys#check-syntax
    717732  (lambda (id exp pat #!optional culprit (se (##sys#current-environment)))
    718733
     
    10341049   '()
    10351050   (##sys#er-transformer
    10361051    (lambda (x r c)
     1052      (##sys#check-toplevel-definition 'define x)
    10371053      (##sys#check-syntax 'define x '(_ . #(_ 1)))
    10381054      (let loop ((form x))
    10391055        (let ((head (cadr form))
  • tests/functor-tests.scm

    diff --git a/tests/functor-tests.scm b/tests/functor-tests.scm
    index 3f0588b..5ef48bb 100644
    a b  
    166166  (import chicken X)
    167167  yibble)
    168168
     169;; XXX This is somewhat iffy: functor instantiation results in a
     170;; value!
    169171(test-equal
    170172 "alternative functor instantiation syntax"
    171173 (module yabble = frob (import scheme) (define yibble 99))