2011/6/18 Matthew Koichi Grimes mkg@cs.nyu.edu
You want:
(define-macro (macro-inc x) (list 'inc x))
or same thing: (define-macro (macro-inc x) `(inc ,x))
(list 'inc x) evaluates at macro-expansion-time as (inc x), which at runtime
evaluates to what you want.
The code you wrote does work when entered in interactive mode (gsi); I seem to recall there being a thread in the past month or two about why that might be. I think the gist was that when running non-interactively, gsc does separate passes for macro-expansion, then evaluation. In the macro-expansion pass, it doesn't yet know about functions defined in that file, so calling those functions directly like you did results in an error. On the other hand, in interactive mode, each line gets its own macro-expansion and evaluation pass. So by the time we get to your (define two (macro-inc 1)) line, the macro-expansion pass recognizes 'inc', defined (in the evaluation pass) of an earlier line.
I hope I got that right, -- Matt
On Sat, Jun 18, 2011 at 8:11 AM, Benjohn Barnes benjohn@fysh.org wrote:
Hi,
I think I must not be understanding something basic about macro expansion.
I've reduced a more complex failure with macros that I am having to this simple example:
; Define a function. (define (inc x) (+ 1 x))
;Define a macro using the function. (define-macro (macro-inc x) (inc x))
; This works okay. (define two (inc 1))
; This fails on load with: ; *** ERROR IN #<procedure #2>, "macro-test.scm"@5.30 -- Unbound
variable: inc
(define macro-two (macro-inc 1))
If I try to load this in to gsc (or if I import in to bsc), then when I try and use (expand) macro-inc (as shown in the last line), I get an error. It's as if I'm not allowed to use functions I have defined in the expansion of a macro?
Thanks, Benjohn
-- benjohn@fysh.org - Twitter @benjohnbarnes - Skype benjohnbarnes - Mobile +44 (0) 7968 851 636
Gambit-list mailing list Gambit-list@iro.umontreal.ca https://webmail.iro.umontreal.ca/mailman/listinfo/gambit-list
Gambit-list mailing list Gambit-list@iro.umontreal.ca https://webmail.iro.umontreal.ca/mailman/listinfo/gambit-list