On Mon, Jun 10, 2013 at 5:40 AM, Christian Stigen Larsen
<[email protected]>wrote:

> 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*?
>

The code is not portable R7RS.  The idea is that cond-expand
and include are normal macros available in the (scheme base)
language, whereas import is a special form which should be
statically analyzable.

[I had forgotten I made a special case for cond-expand in Chibi.
This was for internal (non-portable) tests.]

Note that SRFI-0 is not available in all implementations,
so this isn't a guaranteed compatibility hack.  You might get
better portability by including the R5RS source from the
R7RS program, though the exact file lookup rules are
implementation-defined.

-- 
Alex
_______________________________________________
Scheme-reports mailing list
[email protected]
http://lists.scheme-reports.org/cgi-bin/mailman/listinfo/scheme-reports

Reply via email to