[plt-scheme] What is the role of Syntax Transformers?
On Jun 28, Grant Rettke wrote:
> I read this article:
>
> http://blog.plt-scheme.org/2008/02/dirty-looking-hygiene.html
>
> And see that you can utilize syntax parameters in lieu of unhygienic
> macros.
>
> Is that their goal? Where does this language feature fit?
Just like the title says -- it's only an illusion. The fact is that
hygiene is not actually broken with syntax parameters -- the name *is*
grabbed globally and provided. For example, assume that you have a
`loop' macro that needs to bind unhygienically `break'. For example:
(loop ... (when (= i 100) (break)))
With syntax parameters you do provide `break' -- it just happens to
raise a syntax error unless it's inside a `loop'. Here are some
concrete example for things that will show the differences
(let ([break void])
(loop ... (when (= i 100) (break))))
An unhygienic macro will have `break' do the usual thing; but with
syntax parameters the `break' obeys lexical scope and will be bound to
`void'. (And that's a good thing, since lexical scope still works.)
Another example is
(require (rename-in "loop-macro.ss" [loop repeat] [break abort]))
(repeat ... (when (= i 100) (abort)))
this does not work with unhygienic macro, but is perfectly fine with
syntax parameters.
--
((lambda (x) (x x)) (lambda (x) (x x))) Eli Barzilay:
http://www.barzilay.org/ Maze is Life!