[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: define-syntax
From: |
Marco Maggi |
Subject: |
Re: define-syntax |
Date: |
Wed, 16 Jun 2010 09:35:25 +0200 |
"Ludovic Courtès" wrote:
> (define-syntax +
> (let ((plus +))
I am assuming you are starting the program with:
(import (rnrs))
or you are importing at level 1 a library which exports "+";
if this is the case, and you want R6RS compatibility, IMHO
this should fail because you are redefining the binding for
"+"; many R6RS implementations agree with this (with the
exception of Ypsilon which has hygiene problems and must not
be taken as model).
Notice that bindings from "(rnrs)" are imported at both
levels 0 and 1[1]:
For the libraries defined in the library report, the
export level is 0 for nearly all bindings. The
exceptions are syntax-rules, identifier-syntax, ..., and
_ from the (rnrs base (6)) library, which are exported
with level 1, set! from the (rnrs base (6)) library,
which is exported with levels 0 and 1, and all bindings
from the composite (rnrs (6)) library (see library
chapter on “Composite library”), which are exported with
levels 0 and 1.
As a side note: the existence of the binding for the
keyword can be recorded by SYNTAX in the right-hand side of
a DEFINE-SYNTAX, so that the binding itself is can be used
to refer to the context of the definition:
(import (rnrs))
(define ciao 123)
(define-syntax this
(lambda (stx)
(syntax-case stx ()
((_)
(datum->syntax #'this 'ciao)))))
(write (this))
(newline)
and also:
(import (rnrs))
(define ciao 123)
(define-syntax this
(let ((ctx #'this))
(lambda (stx)
(syntax-case stx ()
((_)
(datum->syntax ctx 'ciao))))))
(write (this))
(newline)
for this kind of things, I suggest taking the behaviour of
Larceny as model: if it works with it, it will probably work
with all the other R6RS implementations.
HTH
[1] <http://www.r6rs.org/final/html/r6rs/r6rs-Z-H-10.html#node_sec_7.2>
--
Marco Maggi