i know what disturb me in this error, it is because the order of definitions has effect but i always learn (was it right?) that in scheme the order of definitions should have no effect on the resulting evaluations.
On Thu, Aug 3, 2023 at 1:01 PM Damien Mattei <damien.mat...@gmail.com> wrote: > > thank you > it is clear now , even if i really never find the macro needed upward > i tested too in racket your example and the messages is simple to understand : > > Welcome to DrRacket, version 8.9 [cs]. > Language: reader > "../Scheme-PLUS-for-Racket/main/Scheme-PLUS-for-Racket/SRFI/SRFI-105.rkt", > with debugging; memory limit: 8192 MB. > '() > > foo > foo: undefined; > cannot reference an identifier before its definition > > bar > bar: undefined; > cannot reference an identifier before its definition > > (define (foo) > (bar 'quux)) > > (define-syntax-rule (bar x) x) > > (display (foo)) > . . ../../../../../../../Applications/Racket > v8.9/collects/racket/private/kw.rkt:1263:25: bar: undefined; > cannot reference an identifier before its definition > > On Thu, Aug 3, 2023 at 11:58 AM Jean Abou Samra <j...@abou-samra.fr> wrote: > > > > overload.scm must be before some definitions of scheme-infix.scm even > > if it is not used here, it is strange, i do not understand all but it > > compiles now > > > > > > > > A minimal reproducer for your problem is > > > > (define (foo) > > (bar 'quux)) > > (define-syntax-rule (bar x) x) > > (display (foo)) > > > > > > Let's dissect what happens. At macro expansion time (during byte > > compilation), first the definition of foo is expanded. bar is unbound, so > > it's compiled as a function call. Then comes the definition of bar as a > > macro, but foo has already been expanded without it. > > > > At runtime, a macro is bound to a syntax transformer, so the binding for > > bar that was unresolved at expand time gets resolved to the toplevel > > binding that gets defined for bar, and you get this error because a macro > > transformer can't be called as a function. > > > >