Wiki
Download
Manual
Eggs
API
Tests
Bugs
show
edit
history
You can edit this page using
wiki syntax
for markup.
Article contents:
== Outdated egg! This is an egg for CHICKEN 4, the unsupported old release. You're almost certainly looking for [[/eggref/5/r7rs|the CHICKEN 5 version of this egg]], if it exists. If it does not exist, there may be equivalent functionality provided by another egg; have a look at the [[https://wiki.call-cc.org/chicken-projects/egg-index-5.html|egg index]]. Otherwise, please consider porting this egg to the current version of CHICKEN. [[tags: egg]] == r7rs [[toc:]] === Description This egg provides support for most of the R7RS Scheme language. It is still under construction and should be considered subject to change. ==== Repository [[https://code.call-cc.org/cgi-bin/gitweb.cgi?p=chicken-r7rs.git;a=summary|git://code.call-cc.org/chicken-r7rs]] ==== Requirements CHICKEN version 4.9.0 or higher, and the following extensions: * [[/egg/make|make]] * [[/egg/matchable|matchable]] * [[/egg/numbers|numbers]] === Usage To add R7RS support to a program, load the {{r7rs}} extension: <enscript highlight="scheme"> (require-extension r7rs) </enscript> This makes most features of the R7RS available, and immediately imports all identifiers from the {{(scheme base)}} library. ==== Compiling To compile R7RS code, it's usually sufficient to load the {{r7rs}} extension by providing the {{-require-extension}} (or {{-R}}) flag to {{csc(1)}}: <enscript highlight="sh"> $ csc -require-extension r7rs foo.scm </enscript> This is equivalent to beginning your program with {{(require-extension r7rs)}}, but avoids the need to modify your source with CHICKEN-specific forms. Alternatively, you can {{cond-expand}} on the extension to load it only when your program is running on CHICKEN: <enscript highlight="scheme"> (cond-expand (r7rs) (chicken (require-extension r7rs))) </enscript> Some syntactic features of the R7RS, such as long-form booleans and extended number literals, require that {{r7rs}} support be activated during compilation. To do this, load the {{r7rs}} egg as a compiler extension by providing the {{-extend}} (or {{-X}}) flag to {{csc(1)}}, as well: <enscript highlight="sh"> $ csc -extend r7rs -require-extension r7rs foo.scm </enscript> ==== Libraries R7RS library forms are converted into standard CHICKEN modules at compile time. During this conversion, R7RS library names (which are proper lists rather than simple identifiers) are mapped to module names by joining their components with periods. Thus, the following programs are roughly equivalent: <enscript highlight="scheme"> ;; A standard CHICKEN module. (module foo.bar (baz) (import scheme) (define baz 1)) </enscript> <enscript highlight="scheme"> ;; An R7RS library definition. (use r7rs) (define-library (foo bar) (import (scheme base)) (export baz) (begin (define baz 1))) </enscript> ===== Import When the {{r7rs}} extension is loaded, it overrides CHICKEN's built-in {{import}} and {{import-for-syntax}} forms with versions that support the R7RS's library syntax. As such, {{r7rs}}'s {{import}} expects library names to be lists rather than single identifiers (as with library definitions). It also does the dual duty of both importing identifiers and loading code, which makes it more akin to CHICKEN's {{require-extension}} (a.k.a. {{use}}) than the built-in {{import}} form. <enscript highlight="scheme"> ;; Without the r7rs extension, import loads identifiers but not the underlying implementation: (import (only (files) pathname-file)) (pathname-file "foo/bar/baz") ; => Error: unbound variable: pathname-file ;; After loading the r7rs extension, import does both: (require-extension r7rs) (import (only (files) pathname-file)) (pathname-file "foo/bar/baz") ; => "baz" </enscript> ===== Inclusion Include forms within library definitions ({{include}}, {{include-ci}}, and {{include-library-declarations}}) search for files relatively to the including file, as well as on the standard include path. The {{include}} form provided by the {{(scheme base)}} also includes files relatively, but only when used at the top level. ===== Conditional expansion The {{(library ...)}} feature test of the {{(scheme base)}} library's {{cond-expand}} form searches for the specified library amongst all currently-loaded modules, any import files in the current directory, and any libraries registered in CHICKEN's extensions repository. Refer to the CHICKEN manual for more information about import files and extensions. <enscript highlight="scheme"> (use r7rs) (define spiffy-installed? (cond-expand ((library (spiffy)) #t) (else #f))) </enscript> ==== Macros The {{r7rs}} extension's {{syntax-rules}} behaves slightly differently than that of CHICKEN proper in a few edge cases. Specifically, it treats undercores as wildcards and allows ellipses within syntax templates to be escaped with {{(... <template>)}}. To use the {{r7rs}} extension's version of {{syntax-rules}}, it must be imported at macro expansion time with {{import-for-syntax}}: <enscript highlight="scheme"> (import-for-syntax r7rs) ; Load r7rs's syntax-rules at expansion time. (define-syntax be-like-begin (syntax-rules () ((be-like-begin name) (define-syntax name (syntax-rules () ((name expr (... ...)) (begin expr (... ...)))))))) (be-like-begin sequence) (sequence 1 2 3 4) ; => 4 </enscript> === Limitations ==== Unsupported features The following features are currently unsupported: ; {{\x...;}} escaped characters : Semicolon-terminated hex values in symbols and strings are not recognized, and will be treated incorrectly if used. ; {{export}} renaming : Export forms with renaming, as in {{(export (rename foo bar))}}, currently signal an error. ; {{equal?}} : The R7RS requires that {{equal?}} terminate when given cyclic data, however the current implementation may enter an infinite loop. ==== Case folding The {{#!fold-case}} and {{#!no-fold-case}} directives are only supported when the {{(scheme read)}} library has been loaded. Use of these directives without first importing {{(scheme read)}} will signal an error. ==== Procedure names Because the {{r7rs}} egg reexports some procedures directly from CHICKEN core under different identifiers, {{r7rs}} procedure names (as accessed by {{procedure-information}}) may not always be correct. ==== Library loading Some implementations treat library name components as filesystem paths and attempt to load the library {{(foo bar baz)}} from the file "foo/bar/baz.scm", for example. This egg does not. Some implementations use the ".sld" file extension for files containing R7RS library definitions. This egg currently provides no special support for such files. ==== Libraries ===== scheme char The procedures exported by the {{(scheme char)}} library are not unicode-aware. ===== scheme r5rs The {{(scheme r5rs)}} library exports the R5RS versions of many identifiers. As such, some of its procedures are incompatible with their R7RS versions, and an unqualified import of the {{(scheme r5rs)}} library will overwrite those R7RS versions and lead to subtle problems. === Examples ==== Compilation <enscript highlight="sh"> $ cat foo.bar.scm (define-library (foo bar) (import (scheme base)) (export baz) (begin (define baz 1))) $ csc -X r7rs -R r7rs -sJ -o foo.bar.so foo.bar.scm $ cat program.scm (import (foo bar) (scheme write)) (display baz) (display #\newline) $ csc -X r7rs -R r7rs program.scm $ ./program 1 </enscript> === About ==== Maintainers The CHICKEN Team ==== History ; 0.0.6 : Export {{exp}} and {{truncate}}; drop export of nonexistent {{infinite?}} from scheme.inexact with no-numbers ; 0.0.5 : Limit implicit imports in libraries to "meta language" (thanks to John J. Foerch) ; 0.0.4 : Fix invalid import warnings ; 0.0.3 : Add read and write hooks ; 0.0.2 : More complete libraries ; 0.0.1 : Prerelease ==== License Copyright (c) 2013-2016 The CHICKEN Team Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Description of your changes:
I would like to authenticate
Authentication
Username:
Password:
Spam control
What do you get when you subtract 6 from 1?