Dear Guile users, syntax-case macros can have cool side effects at expansion time. However, they are still draped in a veil of mystery to me.
Consider this code: (define-syntax hello (lambda (stx) (syntax-case stx () (_ (begin (format (current-error-port) "Hello!\n") (datum->syntax #f "hello")))))) (define-syntax world (lambda (stx) (syntax-case stx () (_ (begin (format (current-error-port) "World!\n") (datum->syntax #f "world")))))) (define-syntax hello-world (lambda (stx) (syntax-case stx () (_ #`(string-append #,hello " " #,world))))) ,expand hello-world Running it gives me: Hello! World! $1 = (string-append "hello" " " "world") Cool! Now, I suspect there are no clear rules to guess the order of expansion (whether Hello! is printed before World! or after). I would very much like to twist that order and reliably get World! and then Hello!. How can I achieve that? (define-syntax hello-world (lambda (stx) (syntax-case stx () (_ (let* ((w #'world) (h #'hello)) #`(string-append #,h " " #,w)))))) With this modification, I get the same order: Hello! World! $1 = (string-append "hello" " " "world") So my guess is that syntax objects are expanded lazily. Is there something I can do to get #'world expanded before #'hello? Best regards, Vivien