I've used the following cond-expand trick to write R7RS programs that are
backwards compatible with RnRS implementations that support SRFI-0:
(cond-expand
(r7rs
(import (scheme base)
(scheme write)))
(else
(begin)))
(display "Hello, world")
(newline)
This works out-of-the-box on a lot of implementations:
$ chibi-scheme cond-expand.scm # v0.6.1
Hello, world!
$ csi -bq cond-expand.scm # chicken v4.8.0.3
Hello, world!
$ mit-scheme --batch-mode < cond-expand.scm # v15.3
Hello, world!
$ guile cond-expand.scm # v1.8.8
Hello, world!
$ scheme cond-expand.scm # tinyscheme 1.39
Hello, world!
$ bigloo -i cond-expand.scm # v3.8c
Hello, world!
I could not get this to work with Scheme48 or Larceny and didn't attempt it
on other implementations.
It also does not work with Mickey Scheme, because I can't figure out if I
should allow it or not.
The problem is that I believe this form of usage is strictly not valid R7RS,
at least not according to the EBNF in R7RS, ch. 7.1.6 (draft 9):
<program> -->
<import declaration>+
<command or definition>+
As such, (import ...) must come before any commands and cond-expand is
defined in (scheme base) --- I'm ignoring the second definition of
cond-expand inside (import ...) blocks.
I know the document allows implementations to extend the language, given it
does not conflict with R7RS. But there's a difference between a language
and its implementation.
So, is the code above valid in the R7RS *language*?
_______________________________________________ Scheme-reports mailing list Scheme-reports@x http://lists.scheme-reports.org/cgi-bin/mailman/listinfo/scheme-reports