[plt-scheme] Scheme Sublanguage
Hi Paulo
> (provide
> define
> if
> zero?
> 1+
> 1-))
>
>Then I tried to use this:
>(module test basic-language
> (define x 1)
> )
>
>But I'm getting
>module: no #%module-begin binding in the module's language in: (module
>test basic-language (define x 1))
>
>
If you try to expand the test module you get:
> (expand #'(module test (file "c:/Documents and
Settings/js/Dokumenter/tmp/slettes/basic.scm")
(define x 1) ))
(module test (file "c:/Documents and
Settings/js/Dokumenter/tmp/slettes/basic.scm")
(#%plain-module-begin (require-for-syntax mzscheme)
(define-values (x) (#%datum . 1))))
So the test module has an implicit #%plain-module-begin around the body.
The docs say:
The mzscheme module binds #%app, #%top, and #%datum as regular
application,
top-level variable reference, and implicit quote, respectively. A
module can export
different transformers with these names to support languages
different from conventional Scheme.
In addition, #%module-begin is used as a transformer for a module
body. A #%module-begin is
implicitly added around a module body when it contains multiple
S-expressions, or when the
S-expression expands to a core form other than #%module-begin or
#%plain-module-begin;
the lexical context for the introduced #%module-begin identifier
includes only the exports of the
module's initial import. After such wrapping, if any, and before any
expansion, an
'enclosing-module-name property is attached to the module-body syntax
object; the property's
value is a symbol for the module name as specified after the module
keyword.
The mzscheme module binds #%module-begin to a form that inserts a
for-syntax import of
mzscheme, so that mzscheme bindings can be used in syntax definitions.
It also exports
#%plain-module-begin, which can be substituted for #%module-begin to
avoid the
for-syntax import of mzscheme. Any other transformer used for
#%module-begin must
expand to mzscheme's #%module-begin or #%plain-module-begin.
That is, all you need to do is to provide #%module-begin in basic-language.
When an expression is fully expanded, all applications, top-level
variable references, and literal
datum expressions will appear as explicit #%app, #%top, and #%datum
forms, respectively. Those
forms can also be used directly by source code. The #%module-begin
form can never usefully
appear in an expression, and the body of a fully expanded module
declaration is not wrapped
with #%module-begin; instead, it is wrapped with #%plain-module-begin.
Along with #%app, #%top, and #%datum. Of course you can define your own
restricted
versions of these as my-app, my-top and my-datum and provide (renamed)
versions of
these. E.g. you can let my-datum check that the literal is an integer.
See also the lambda-calculus example in the docs.
--
Jens Axel Søgaard