Next: Internal Macros, Previous: Syntax Parameters, Up: Macros [Contents][Index]
As syntax-case macros have the whole power of Scheme available to them,
they present a problem regarding time: when a macro runs, what parts of the
program are available for the macro to use?
The default answer to this question is that when you import a module (via
define-module or use-modules), that module will be loaded up at
expansion-time, as well as at run-time. Additionally, top-level syntactic
definitions within one compilation unit made by define-syntax are also
evaluated at expansion time, in the order that they appear in the compilation
unit (file).
But if a syntactic definition needs to call out to a normal procedure at expansion-time, it might well need need special declarations to indicate that the procedure should be made available at expansion-time.
For example, the following code will work at a REPL, but not in a file:
;; incorrect (use-modules (srfi srfi-19)) (define (date) (date->string (current-date))) (define-syntax %date (identifier-syntax (date))) (define *compilation-date* %date)
It works at a REPL because the expressions are evaluated one-by-one, in order, but if placed in a file, the expressions are expanded one-by-one, but not evaluated until the compiled file is loaded.
The fix is to use eval-when.
;; correct: using eval-when (use-modules (srfi srfi-19)) (eval-when (compile load eval) (define (date) (date->string (current-date)))) (define-syntax %date (identifier-syntax (date))) (define *compilation-date* %date)
Evaluate exp... under the given conditions. Valid conditions include
eval, load, and compile. If you need to use
eval-when, use it with all three conditions, as in the above example.
Other uses of eval-when may void your warranty or poison your cat.
Next: Internal Macros, Previous: Syntax Parameters, Up: Macros [Contents][Index]