-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
Hi Per,
On 20-03-12 20:34, Per Eckerdal wrote:
Gambit and hygienic macros
Gambit ships with a generic implementation of syntax-case hygienic macros, psyntax, but in practise it does not work very well, especially in conjunction with features that are specific to Gambit.
Indeed.
Proposal
This is more of a straw man than a proper proposal, and I am fully aware that this will probably conflict with many ideas that R7RS introduces.
This proposal is about a way of achieving hygienic macros that is far more lightweight than any other hygienic Scheme macro system that I know of. In fact, Gambit already includes most of the machinery that is required by this system.
I did not invent this technique myself. The basic idea is described here: http://www.p-cos.net/documents/hygiene.pdf
According to that paper, symbol macros aka identifier macros are needed to make this work.
Restrictions on name binding
For hygiene to work, shadowing bindings must be disallowed. This code snippet illustrates the problem:
(let ((a 0)) (define-macro (mac name) `(list ,(alias a) ,name)) (let ((a 1)) ;; This should return (0 1), but it will return (1 1). (mac a)))
To make this possible, defining a name that is already defined must be disallowed. I would make it a compilation error.
Almost stopped reading after that last sentence there!
Auto-aliasing bindings
Fortunately then my eye caught sight of the below and I continued reading...
The restriction of not being allowed to bind a name that's already bound is clearly too limiting; we want the code above with the two |a|s to work.
I would love to hear what you think about this.
I would be interested in knowing how this proposal compares with implementing a low-level hygienic macro system such as syntactic closures or explicit renaming macros. Actually now that I said that this proposal sounds very much like a (partial?) implementation of explicit renaming macros on top of the defmacro system. Doesn't the paper you referenced mention something like that as well?
Marijn