Re: definitions in macros?
On Sun, Mar 22, 2020 at 10:09 PM David Kastrup wrote: > > In the code below, it looks like only one of the two definitions in > > the body of my-macro-new takes effect. Is this expected, and if so, > > why? > > > > (defmacro-public my-macro-old (command-and-args . definition) > > (module-define! (current-module) 'x1 "I am X1\n") > > (module-define! (current-module) 'x2 "I am X2\n")) > > > > (defmacro-public my-macro-new (command-and-args . definition) > > `(define p "i am P\n") > > `(define q "i am Q\n")) > > This is very much expected. The macro body contains two side-effect > free expressions (namely quoted lists) and returns the last one which is .. > You probably wanted something like > `(begin (define p ...) (define q ...)) d'oh! I am an idiot. Thanks, -- Han-Wen Nienhuys - hanw...@gmail.com - http://www.xs4all.nl/~hanwen
Re: definitions in macros?
Han-Wen Nienhuys writes: > Hi there, > > in my quest to get lilypond working with GUILE 2+, I've hit another > stumbling block. > > In order to make compilation with GUILE 2+ working, we have to move > away from runtime symbol definition (ie. module-define! calls). > > In the code below, it looks like only one of the two definitions in > the body of my-macro-new takes effect. Is this expected, and if so, > why? > > (defmacro-public my-macro-old (command-and-args . definition) > (module-define! (current-module) 'x1 "I am X1\n") > (module-define! (current-module) 'x2 "I am X2\n")) > > (defmacro-public my-macro-new (command-and-args . definition) > `(define p "i am P\n") > `(define q "i am Q\n")) This is very much expected. The macro body contains two side-effect free expressions (namely quoted lists) and returns the last one which is (define q "i am Q\n") This then gets evaluated at run time, defining q . You probably wanted something like `(begin (define p ...) (define q ...)) as your body (and return expression) instead. > (my-macro-old 1 2) > (my-macro-new 1 2) > (display x1) > (display x2) > (display q) > (display p) > > > thanks, -- David Kastrup
Re: definitions in macros?
On 3/22/20 12:07 PM, Han-Wen Nienhuys wrote: Hi there, in my quest to get lilypond working with GUILE 2+, I've hit another stumbling block. In order to make compilation with GUILE 2+ working, we have to move away from runtime symbol definition (ie. module-define! calls). In the code below, it looks like only one of the two definitions in the body of my-macro-new takes effect. Is this expected, and if so, why? (defmacro-public my-macro-old (command-and-args . definition) (module-define! (current-module) 'x1 "I am X1\n") (module-define! (current-module) 'x2 "I am X2\n")) (defmacro-public my-macro-new (command-and-args . definition) `(define p "i am P\n") `(define q "i am Q\n")) (my-macro-old 1 2) (my-macro-new 1 2) (display x1) (display x2) (display q) (display p) thanks, Try the following. Not sure about defmacro but define-syntax must return a single form. (defmacro-public my-macro-new (command-and-args . definition) `(begin (define p "i am P\n") (define q "i am Q\n")))
definitions in macros?
Hi there, in my quest to get lilypond working with GUILE 2+, I've hit another stumbling block. In order to make compilation with GUILE 2+ working, we have to move away from runtime symbol definition (ie. module-define! calls). In the code below, it looks like only one of the two definitions in the body of my-macro-new takes effect. Is this expected, and if so, why? (defmacro-public my-macro-old (command-and-args . definition) (module-define! (current-module) 'x1 "I am X1\n") (module-define! (current-module) 'x2 "I am X2\n")) (defmacro-public my-macro-new (command-and-args . definition) `(define p "i am P\n") `(define q "i am Q\n")) (my-macro-old 1 2) (my-macro-new 1 2) (display x1) (display x2) (display q) (display p) thanks, -- Han-Wen Nienhuys - hanw...@gmail.com - http://www.xs4all.nl/~hanwen