[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
7.5.2 SRFI-0 - cond-expand
This SRFI lets a portable Scheme program test for the presence of certain features, and adapt itself by using different blocks of code, or fail if the necessary features are not available. There’s no module to load, this is in the Guile core.
A program designed only for Guile will generally not need this mechanism, such a program can of course directly use the various documented parts of Guile.
- syntax: cond-expand (feature body…) …
Expand to the body of the first clause whose feature specification is satisfied. It is an error if no feature is satisfied.
Features are symbols such as
srfi-1
, and a feature specification can useand
,or
andnot
forms to test combinations. The last clause can be anelse
, to be used if no other passes.For example, define a private version of
alist-cons
if SRFI-1 is not available.(cond-expand (srfi-1 ) (else (define (alist-cons key val alist) (cons (cons key val) alist))))
Or demand a certain set of SRFIs (list operations, string ports,
receive
and string operations), failing if they’re not available.(cond-expand ((and srfi-1 srfi-6 srfi-8 srfi-13) ))
The Guile core has the following features,
guile guile-2 ;; starting from Guile 2.x r5rs srfi-0 srfi-4 srfi-13 srfi-14 srfi-23 srfi-39 srfi-55 srfi-61 srfi-105
Other SRFI feature symbols are defined once their code has been loaded
with use-modules
, since only then are their bindings available.
The ‘--use-srfi’ command line option (see section Invoking Guile) is
a good way to load SRFIs to satisfy cond-expand
when running a
portable program.
Testing the guile
feature allows a program to adapt itself to
the Guile module system, but still run on other Scheme systems. For
example the following demands SRFI-8 (receive
), but also knows
how to load it with the Guile mechanism.
(cond-expand (srfi-8 ) (guile (use-modules (srfi srfi-8))))
Likewise, testing the guile-2
feature allows code to be portable
between Guile 2.0 and previous versions of Guile. For instance, it
makes it possible to write code that accounts for Guile 2.0’s compiler,
yet be correctly interpreted on 1.8 and earlier versions:
(cond-expand (guile-2 (eval-when (compile) ;; This must be evaluated at compile time. (fluid-set! current-reader my-reader))) (guile ;; Earlier versions of Guile do not have a ;; separate compilation phase. (fluid-set! current-reader my-reader)))
It should be noted that cond-expand
is separate from the
*features*
mechanism (see section Feature Tracking), feature
symbols in one are unrelated to those in the other.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This document was generated on April 20, 2013 using texi2html 5.0.