Copyright © 2000-2004, Felix L. Winkelmann All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
srfi-13-syntax.scm
chicken-highlevel-macros.scm
chicken-more-macros.scm
chicken-ffi-macros.scm
chicken-entry-points.scm
chicken-default-entry-points.scm
test-infrastructure.scm
CHICKEN - A practical and portable Scheme system User's manual (Version 1, Build 63)
(c) 2000-2004, Felix L. Winkelmann All rights reserved. Translated to LaTeX by Peter Keller. Translated to texinfo by Linh Dang.
--- The Detailed Node Listing ---
Using the compiler
Using the interpreter
Supported language
Non-standard macros and special forms
Unit library
Unit eval
Unit extras
Unit posix
Unit utils
Unit lolevel
Unit tinyclos
Interface to external functions and variables
The Easy Foreign Function Interface
chicken-setup
Additional files
test-infrastructure.scm
CHICKEN is a compiler that translates Scheme source files into C, which in turn can be fed to a C-compiler to generate a standalone executable. This principle, which is used by several existing compilers, achieves high portability because C is implemented on nearly all available platforms.
This package is distributed under the BSD license and as such is free to use and modify. An interpreter is also available and can be used as a scripting environment or for testing programs before compilation.
The method of compilation and the design of the runtime-system follow
closely Henry Baker's CONS Should Not CONS Its Arguments, Part II:
Cheney on the M.T.A. paper and expose a number of interesting
properties: consing (creation of data on the heap) is relatively
inexpensive, because a generational garbage collection scheme is used,
in which short-lived data structures are reclaimed extremely quickly.
Moreover, call-with-current-continuation
is practically for free
and CHICKEN does not suffer under any performance penalties if
first-class continuations are used in complex ways. The generated C
code is fully tail-recursive.
Some of the features supported by CHICKEN:
syntax-case
highlevel macros
match
package
format
,
UNIX system calls and extended data structures
The compiler translates Scheme source code into fairly portable C that can be compiled and linked with most available C compilers. CHICKEN supports the generation of executables and libraries, linked either statically or dynamically. Compiled Scheme code can be loaded dynamically, or can be embedded in applications written in other languages. Separate compilation of modules is fully supported.
The most portable way of creating separately linkable entities is supported by so-called units. A unit is a single compiled object module that contains a number of toplevel expressions that are executed either when the unit is the main unit or if the unit is used. To use a unit, the unit has to be declareed as used, like this:
(declare (uses UNITNAME))
The toplevel expressions of used units are executed in the order in which the units appear in the uses declaration. Units may be used multiple times and uses declarations may be circular (the unit is initialized at most once). To compile a file as a unit, add a unit declaration:
(declare (unit UNITNAME))
When compiling different object modules, make sure to have one main unit. This unit is called initially and initializes all used units before executing its toplevel expressions. The main-unit has no unit declaration.
Another method of using definitions in separate source files is to include them. This simply inserts the code in a given file into the current file:
(include "FILENAME")
One important thing: macro definitions are only available when processed
by include
or visit
.
Macro definitions in separate units are not available, since
they are defined at compile time, i.e the time when that other unit
was compiled (macros defined using the low-level macro system can optionally be
available at runtime, see define-macro in Substitution forms and macros).
On platforms that support dynamic loading of compiled code (like Windows and most ELF based
systems like Linux or BSD), it is not necessary to use unit declarations. Here
code can be compiled into a shared object (.so
) and loaded dynamically into
a running application.
The interface to chicken
is intentionally simple. System
dependent makefiles, shell-scripts or batch-files should perform
any necessary steps before and after invocation of chicken
.
On UNIX-compatible systems, a shell script named chicken-config
is supplied that emits the correct options for the host system's C
compiler. Enter
chicken-config -help
on the command line for a list of available options. On most UNIX
systems, a Scheme script named csc
provides a much simpler
interface to the Scheme- and C-compilers and linker. Enter
csc -help
on the command line for more information. A batch-file (csc.bat
)
with the same functionality is also available for Windows platforms. The Windows
version of csc (csc.bat
) does not accept more than 8 arguments.
chicken FILENAME {OPTION}
FILENAME
is the complete pathname of the source file that is to
be translated into C. A filename argument of “-
” specifies that
the source text should be read from standard input. Note that the filename
has to be the first argument to chicken
.
Possible options are:
-analyze-only
-benchmark-mode
-debug-level 0 -optimize-level 3
-fixnum-arithmetic -disable-interrupts -block -lambda-lift
.
-block
eval
and unused toplevel bindings are removed.
-case-insensitive
case-insensitive
feature identifier.
-check-syntax
-compress-literals THRESHOLD
THRESHOLD
as strings
and parse the strings at run-time. This reduces the size of the code and
speeds up compile-times of the host C compiler, but has a small run-time
performance penalty. The size of a literal is computed by counting recursively the objects
in the literal, so a vector counts as 1 plus the count of the elements,
a pair counts as the counts of the car and the cdr, respectively.
All other objects count 1.
-debug MODES
MODES
is a string
of characters that select debugging information about the compiler that
will be printed to standard output.
-debug-level LEVEL
LEVEL
should be an integer.
-debug-level 0
is equivalent to -no-trace
.
-debug-level 1
does nothing.
-disable-c-syntax-checks
-disable-interrupts
(disable-interrupts)
declaration. No
interrupt-checks are generated for compiled programs.
-disable-stack-overflow-checks
-:o
runtime option.
-dynamic
-epilogue FILENAME
FILENAME
at the end of the compiled source file. The include-path
is not searched. This option may be given multiple times.
-explicit-use
library, eval
and extras
.
Use this option if compiling a library unit instead of an application
unit.
-extend FILENAME
-feature SYMBOL
SYMBOL
to be a valid feature identifier for
cond-expand
.
-ffi
#>! ... <#
.
-ffi-define SYMBOL
foreign-parse
declarations.
-ffi-include-path PATH
-fixnum-arithmetic
(fixnum-arithmetic)
declaration. Assume all
mathematical operations use small integer arguments.
-heap-size NUMBER
NUMBER
bytes. The parameter may be followed by a
M
(m
) or K
(k
)
suffix which stand for mega- and kilobytes, respectively. The default
heap size is 5 kilobytes. Note that only half of it is in use at every
given time.
-heap-initial-size NUMBER
-heap-growth PERCENTAGE
-:hg
).
-heap-shrinkage PERCENTAGE
-:hs
).
-help
-syntax
-hygienic
hygienic-macros
feature identifier.
-hygienic-at-run-time
cond-expand
). To load all further macros, execute:
(require-extension chicken-more-macros)
-include-path PATHNAME
include
special form. This option may be given multiple times. If
the environment variable CHICKEN_INCLUDE_PATH
is set, it
should contain a list of alternative include pathnames separated by
“;
”. The environment variable CHICKEN_HOME
is also
considered as a search path.
-keyword-style STYLE
STYLE
may be either
prefix
(as in Common Lisp), suffix
(as in DSSSL) or none
.
Any other value is ignored. The default is suffix
.
If -strict
or -strict-reader
is specified, then the keyword
style is set to none
.
-lambda-lift
-no-trace
-no-trace
is specified. With this option the generated
code is slightly faster.
-no-feature SYMBOL
SYMBOL
.
-no-warnings
-nursery NUMBER -stack-size NUMBER
NUMBER
bytes. The parameter may be followed by a M
(m
) or K
(k
) suffix. The default stack-size
depends on the target platform.
-optimize-leaf-routines
-optimize-level LEVEL
LEVEL
should be
an integer.
-optimize-level 0
does nothing.
-optimize-level 1
is equivalent to
-optimize-leaf-routines
-optimize-level 2
is equivalent to
-optimize-leaf-routines -usual-integrations
-optimize-level 3
is equivalent to
-optimize-leaf-routines -usual-integrations -unsafe
-output-file FILENAME
FILENAME.c
.
-postlude EXPRESSIONS
EXPRESSIONS
after all other toplevel expressions in the
compiled file. This option may be given multiple times. Processing of
this option takes place after processing of -epilogue
.
-prelude EXPRESSIONS
EXPRESSIONS
before all other toplevel expressions in the
compiled file. This option may be given multiple times. Processing of
this option takes place before processing of -prologue
.
-profile
exit
or implicitly), profiling statistics are written to a file named
PROFILE
. Each line of the generated file contains a list with
the procedure name, the number of calls and the time spent executing
it. Use the chicken-format-profile
program to display the profiling
information in a more user-friendly form. Enter chicken-format-profile
with no arguments at the command line to get a list of available options.
-prologue FILENAME
FILENAME
at the start of the compiled
source file. The include-path is not searched. This option may be given
multiple times.
-quiet
-require-for-syntax NAME
NAME
before the compilation process
commences.
-r5rs
-hygienic -strict
.
-run-time-macros
-hygienic
option) also available
at run-time. By default low-level macros are not available at
run-time. Note that highlevel-macros (syntax-case
) defined in
compiled code are never available at run-time.
-split NUMBER
filename0
, ..., filename<NUMBER-1>
with as many
files as given in NUMBER
.
-split-level NUMBER
-strict
strict
feature identifier. Implies -strict-letrec
and -strict-reader
.
-strict-srfi-0
cond-expand
. This option
registers the strict
feature identifier. Implies -strict-letrec
and -strict-reader
.
-strict-reader
-case-insensitive
.
-strict-letrec
letrec
. This generates slightly less
efficient code but preserves standard semantics.
-to-stdout
.c
file.
-unit NAME
-prelude "(declare (unit NAME))"
-unsafe
-unsafe-libraries
-uses NAME
NAME
. This is equivalent to
-prelude "(declare (uses NAME))"
-usual-integrations
(usual-integrations)
.
-version
-verbose
The environment variable CHICKEN_OPTIONS
can be set to a string
with default command-line options for the compiler.
After successful compilation a C source file is generated and can be compiled with a C compiler. Executables generated with CHICKEN (and the compiler itself) accept a small set of runtime options:
-:?
-:c
csi
) to force output of the #;> prompt even if stdin
is not a terminal (for example if running in an emacs
buffer
under Windows).
-:d
-:hNUMBER
-:hiNUMBER
-:hgPERCENTAGE
PERCENTAGE
.
The default is 200.
-:hmNUMBER
-:hsPERCENTAGE
PERCENTAGE
of the heap is used, then it will shrink to
PERCENTAGE
. The default is 50. Note: If you want to make sure
that the heap never shrinks, specify a value of 0
. (this can
be useful in situations where an optimal heap-size is known in advance).
-:o
-:sNUMBER
-:tNUMBER
-:w
-:r
-no-trace
or -debug-level 0
options.
The argument values may be given in bytes, in kilobytes (suffixed with
K
or k
), in megabytes (suffixed with M
or m
), or in gigabytes (suffixed with G
or g
). Runtime options may be combined, like -:dc
,
but everything following a NUMBER
argument is ignored. So
-:wh64m
is OK, but -:h64mw
will not enable GC of
unused symbols.
To compile a Scheme program (assuming a UNIX-like environment) we perform the following steps:
foo.scm
;;; foo.scm (define (fac n) (if (zero? n) 1 (* n (fac (- n 1))) ) ) (write (fac 10)) (newline)
foo.scm
% chicken foo.scm
foo.c
% gcc foo.c -o foo `chicken-config -cflags -libs`
% foo
3628800
If multiple bodies of Scheme code are to be combined into a single executable, then we have to compile each file and link the resulting object files together with the runtime system:
foo.scm
and bar.scm
;;; foo.scm (declare (uses bar)) (write (fac 10)) (newline) ;;; bar.scm (declare (unit bar)) (define (fac n) (if (zero? n) 1 (* n (fac (- n 1))) ) )
foo.scm
and bar.scm
% chicken foo.scm % chicken bar.scm
foo.c
and bar.c
% gcc -c foo.c `chicken-config -cflags` % gcc -c bar.c `chicken-config -cflags`
foo.o
and bar.o
% gcc foo.o bar.o -o foo `chicken-config -libs`
% foo 3628800
The declarations specify which of the compiled files is the main
module, and which is the library module. An executable can only have
one main module, since a program has only a single entry-point. In this
case foo.scm
is the main module, because it doesn't have a
unit
declaration.
Extensions to the basic CHICKEN runtime libraries are available in a
separate utility library (libsrfi-chicken.[a|so]
and libstuffed-chicken.[a|so]
on UNIX-like platforms,
libsrfi-chicken.lib
and libstuffed-chicken.lib
on Windows
systems). Whenever you use one or more of the units format, srfi-1, srfi-4, srfi-13, srfi-14, srfi-18, srfi-25, srfi-37,
posix, utils, lolevel, tinyclos
or regex
, then you
should add these library to the command line of the C compiler or
linker. The compiler driver csc
and the helper script chicken-config
will do this automatically.
The compiler supplies a couple of hooks to add user-level passes to the
compilation process. Before compilation commences any Scheme source files
or compiled code specified using the -extend
option are loaded
and evaluated. The parameters user-options-pass, user-read-pass,
user-preprocessor-pass, user-pass, user-pass-2
and user-post-analysis-pass
can be set
to procedures that are called to perform certain compilation passes
instead of the usual processing (for more information about parameters
see: Parameters.
Holds a procedure that will be called with a list of command-line arguments and should return two values: the source filename and the actual list of options, where compiler switches have their leading
-
(hyphen) removed and are converted to symbols. Note that this parameter is invoked before processing of the-extend
option, and so can only be changed in compiled user passes.
Holds a procedure of three arguments. The first argument is a list of strings with the code passed to the compiler via
-prelude
options. The second argument is a list of source files including any files specified by-prologue
and-epilogue
. The third argument is a list of strings specified using-postlude
options. The procedure should return a list of toplevel Scheme expressions.
Holds a procedure of one argument. This procedure is applied to each toplevel expression in the source file before macro-expansion. The result is macro-expanded and compiled in place of the original expression.
Holds a procedure of one argument. This procedure is applied to each toplevel expression after macro-expansion. The result of the procedure is then compiled in place of the original expression.
Holds a procedure of three arguments, which is called with the canonicalized node-graph and the analysis database accessors as arguments (see below for an explanation of the accessor arguments). The result is ignored, so this pass has to mutate the node-structure to cause any effect.
Holds a procedure that will be called after the last performed program analysis. The procedure (when defined) will be called with three arguments: the program database, a getter and a setter-procedure which can be used to access and manipulate the program database, which holds various information about the compiled program. The getter procedure should be called with two arguments: a symbol representing the binding for which information should be retrieved, and a symbol that specifies the database-entry. The current value of the database entry will be returned or
#f
, if no such entry is available. The setter procedure is called with three arguments: the symbol and key and the new value.For information about the contents of the program database contact the author.
Loaded code (via the -extend
option) has access to the library
units extras, srfi-1, srfi-4, utils, regex
and the pattern matching macros.
The highlevel macro-system and multithreading is not available.
Note that the macroexpansion/canonicalization phase of the compiler adds
certain forms to the source program. These extra expressions are not
seen by user-preprocessor-pass
but by user-pass
.
It is relatively easy to create distributions of Scheme projects that
have been compiled to C. The runtime system of CHICKEN consists of only
two handcoded C files (runtime.c
and chicken.h
), plus
the file chicken-config.h
, which is generated by the build process. All
other modules of the runtime system and the extension libraries are just
compiled Scheme code. For more information, study the CHICKEN source code
and/or get in contact with the author.
CHICKEN provides an interpreter named csi
for evaluating Scheme programs
and expressions.
csi {FILENAME|OPTION}
where FILENAME
specifies a file with Scheme source-code. If the
extension of the source file is .scm
, it may be omitted. The
runtime options described in Compiler command line format are also available
for the interpreter. If the environment variable CSI_OPTIONS
is set to a list of options, then these options are additionally passed
to every direct or indirect invocation of csi
. Please note that
runtime options (like -:...
) can not be passed using this method.
The options recognized by the interpreter are:
--
-:...
”) are still recognized.
-case-insensitive
case-insensitive
feature identifier.
-batch
-eval EXPRESSIONS
EXPRESSIONS
.
-feature SYMBOL
SYMBOL
to be a valid feature identifier for
cond-expand
.
-help
-syntax
-hygienic
hygienic-macros
feature identifier.
-include-path PATHNAME
include
special form. This option may be given multiple times. If
the environment variable CHICKEN_INCLUDE_PATH
is set, it
should contain a list of alternative include pathnames separated by
“;”. The environment variable CHICKEN_HOME
is also
considered as a search path.
-keyword-style STYLE
STYLE
may be either
prefix
(as in Common Lisp) or suffix
(as in DSSSL).
Any other value is ignored.
-no-feature SYMBOL
SYMBOL
.
-no-init
-no-warnings
-quiet
-r5rs
-hygienic -strict
.
-script PATHNAME
-batch -quiet -no-init
PATHNAME
. Arguments following PATHNAME
are available by using
command-line-arguments
and are not processed as interpreter
options.
-script-meta PATHNAME
-script
option, but the file specified
by PATHNAME
is opened, the first line is treated as containing
additional command line options and (after processing all the options)
the code from the given file is loaded.
-strict
-strict-letrec
and -strict-reader
.
-strict-srfi-0
cond-expand
. Implies -strict-letrec
and -strict-reader
.
-strict-reader
-case-insensitive
.
-strict-letrec
letrec
. This generates slightly less
efficient code but preserves standard semantics.
-version
#!
notation for starting scripts,
the interpreter ignores the first line of a source file, if prefixed by #!
.
The easiest way is to use the -script
option like this:
% cat foo #! /usr/local/bin/csi -script (print (eval (with-input-from-string (car (command-line-arguments)) read))) % chmod +x foo % foo "(+ 3 4)" 7
The parameter command-line-arguments
is set to a list of the
parameters that were passed to the Scheme script. Scripts can be compiled
to standalone executables (don't forget to declare used library units).
Note that the compiler does not parse the extra arguments passed
to a script via the -script-meta
option!
To overcome a limitation of UNIX that allows only a single argument to
scripts, the -script-meta
options is provided:
% cat foo #! /usr/local/bin/csi -script-meta -case-insensitive (print (with-input-from-string (car (command-line-arguments)) read)) % chmod +x foo % foo "FooBar" "foobar"
scheme-r4rs, scheme-ieee-1178-1990, scheme-r5rs
and
scheme-srfi-0
). Scheme scripts can be
compiled, the compiler determines language dialect from the invocation
line:
% cat bar #! /usr/bin/env scheme-r5rs (define (main args) (write (list->string (reverse (string->list (cadr args))))) (newline) 0) % csi -script bar "one two three" "eerht owt eno" % chicken bar -quiet % gcc bar.c `chicken-config -cflags -libs` -o cbar % cbar "one two three"} "eerht owt eno"
For more information, see the SRFI-22 document
CHICKEN supports writing shell scripts in Scheme for these platforms as well, using a slightly different approach. The first example would look like this on Windows:
C:>type foo.bat @;csibatch %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 (print (eval (with-input-from-string (car (command-line-arguments)) read))) C:>foo "(+ 3 4)" 7
Like UNIX scripts, batch files can be compiled. Windows batch scripts do not accept more than 8 arguments.
The toplevel loop understands a number of special commands:
,?
,NUM
NUM
th command in history-list
,h
,l FILENAME
FILENAME
(may be a symbol or string).
,ln FILENAME
,p EXP
EXP
.
,d EXP
EXP
.
,du EXP
EXP
.
,dur EXP N
N
bytes of the result of evaluated expression EXP
.
,q
,r
,s STRING-OR-SYMBOL
,t EXP
,x EXP
EXP
(the expression is
not evaluated).
Additional macros and procedures available in the interpreter are:
(advise NAME MODE PROC)Modifies the behavior of the procedures named
NAME
, according toMODE
:
before
- Call the procedure
PROC
before every invocation ofNAME
, with the same arguments.after
- Call the procedure
PROC
with the result value(s) ofNAME
.around
- Call the procedure
PROC
with the arguments passed toNAME
. Additionally the (original) value ofNAME
is passed as the first argument toPROC
.Only the
PROC
argument is evaluated. Note that multiple pieces of advice on the same procedure are allowed.#;> (define (fac n) (if (zero? n) 1 (* n (fac (sub1 n))))) #;> (define count 0) #;> (advise fac before (lambda _ (set! count (add1 count)))) #;> (fac 10) ==> 3628800 #;> count ==> 11 #;> (advise fac around (let ((i 0)) (define (indent) (do ((i i (sub1 i))) ((zero? i)) (write-char #\space))) (lambda (f n) (indent) (print "fac: " n) (set! i (add1 i)) (let ((x (f n))) (set! i (sub1 i)) (indent) (print "-> " x) x)))) #;> (fac 3) fac: 3 fac: 2 fac: 1 fac: 0 -> 1 -> 1 -> 2 -> 6 ==> 6 #;> count ==> 15 #;> (set! count 0) #;> (unadvise fac) #;> (fac 10) ==> 3628800 #;> count ==> 0
(unadvise NAME ...)Removes all pieces of advice from the procedures
NAME ...
and restores their original behavior.
(trace NAME ...)Switches tracing on for the procedures with the given names.
#;> (fac 10) ==> 3628800 #;> (trace fac) #;> (fac 3) |(fac 3) | (fac 2) | (fac 1) | (fac 0) | fac -> 1 | fac -> 1 | fac -> 2 |fac -> 6 ==> 6 #;> (untrace fac) #;> (fac 3) ==> 6
[2] Identifiers are by default case-sensitive.
[4.1.4] Extended DSSSL style lambda lists are supported. DSSSL formal argument lists are defined by the following grammar:
<formal-argument-list> ==> <required-formal-argument>* [(#!optional <optional-formal-argument>*)] [(#!rest <rest-formal-argument>)] [(#!key <key-formal-argument>*)] <required-formal-argument> ==> <ident> <optional-formal-argument> ==> <ident> | (<ident> <initializer>) <rest-formal-argument> ==> <ident> <key-formal-argument> ==> <ident> | (<ident> <initializer>) <initializer> ==> <expr>
When a procedure is applied to a list of actual arguments, the formal and actual arguments are processed from left to right as follows:
#f
. The initializer is evaluated in an environment in which all previous formal arguments have been bound.
#!key
was specified in the formal-argument-list, there shall be an even number of remaining actual arguments. These are interpreted as a series of pairs, where the first member of each pair is a keyword specifying the argument name, and the second is the corresponding value. It shall be an error if the first member of a pair is not a keyword. It shall be an error if the argument name is not the same as a variable in a keyword-formal-argument, unless there is a rest-formal-argument. If the same argument name occurs more than once in the list of actual arguments, then the first value is used. If there is no actual argument for a particular keyword-formal-argument, then the variable is bound to the result of evaluating initializer if one was specified, and otherwise #f
. The initializer is evaluated in an environment in which all previous formal arguments have been bound.
It shall be an error for an <ident>
to appear more than once in a formal-argument-list.
Example:
((lambda (x y) x) 3 4 5 6) =>(3 4 5 6) ((lambda (x y #!rest z) z) 3 4 5 6) => (5 6) ((lambda (x y #!optional z #!rest r #!key i (j 1)) (list x y z i: i j: j)) 3 4 5 i: 6 i: 7) => (3 4 5 i: 6 j: 1)
[4.1.6] set!
for unbound toplevel variables is allowed.
[5.2] define
with a single argument is allowed and initializes the toplevel or local binding
to an unspecified value.
[6.2.4] The runtime system uses the numerical string-conversion routines of the underlying C library and so does only understand standard (C-library) syntax for floating-point constants.
[6.2.5] The routines complex?
, real?
and rational?
are identical to the standard procedure
number?
. The procedures numerator
, denominator
and rationalize
are not implemented. Also not implemented are
all procedures related to complex numbers.
[6.2.6] The procedure string->number
does not obey read/write
invariance on inexact numbers.
[6.5] Code evaluated in scheme-report-environment
or
null-environment
still sees non-standard syntax unless running
under the interpreter (csi
) invoked with the -strict
option.
[6.6.2] The procedure char-ready?
is handling terminal input
ports only under DJGPP correctly. On other platforms it returns always
#t
. The procedure read
does not obey read/write
invariance on inexact numbers.
[6.6.3] The procedures write
and display
do not obey
read/write invariance to inexact numbers.
[2.1] Identifiers may contain special characters if delimited with
| ... |
.
[2.3] The brackets [ ... ]
are provided as an alternative syntax
for ( ... )
. A number of reader extensions is provided. See
Non standard read syntax.
[4] Numerous non-standard macros are provided. See Non-standard macros and special forms for more information.
[4.2.2] It is allowed for initialization values of bindings in a letrec
construct to refer to previous variables in the same set of bindings, so
(letrec ([foo 123] [bar foo] ) bar)
is allowed and returns 123
. This extension is not available
when strict R5RS letrec
semantics have been selected (by using the
-strict
, -strict-srfi-0
or -strict-letrec
option).
[4.2.3] (begin)
is allowed in non-toplevel contexts and evaluates
to an unspecified value.
[4.2.5] Delayed expressions may return multiple values.
[5.2.2] CHICKEN extends standard semantics by allowing internal definitions
everywhere, and not only at the beginning of a body. A set of internal definitions
is equivalent to a letrec
form enclosing all following expressions
in the body:
(let ([foo 123]) (bar) (define foo 456) (baz foo) )
expands into
(let ([foo 123]) (bar) (letrec ([foo 456]) (baz foo) ) )
This extension to the standard semantics is not available in combination with
the hygienic (syntax-case
) macro system. Under the hygienic macro system
an error will be signalled when internal definitions occur at a position that
is not at the beginning of a body.
[6] CHICKEN provides numerous non-standard procedures. See the manual sections on library units for more information.
[6.3.4] User defined character names are supported. See
char-name
in User-defined named characters.
[6.3.5] CHICKEN supports special characters preceded with
a backslash “\” in quoted string
constants. “\n” denotes the newline-character,
“\r” carriage return, “\b”
backspace, “\t” TAB and
“\xXX” a character with the code XX
in hex.
The third argument to substring
is optional and defaults to the length
of the string.
[6.4] force
called with an argument that is not a promise returns
that object unchanged. Captured continuations can be safely invoked
inside before- and after-thunks of a dynamic-wind
form and
execute in the outer dynamic context of the dynamic-wind
form.
[6.5] The second argument to eval
is optional and
defaults to the value of (interaction-environment)
.
scheme-report-environment
and null-environment
accept
an optional 2nd parameter: if not #f
(which is the default),
toplevel bindings to standard procedures are mutable and new toplevel
bindings may be introduced.
[6.6.1] if the procedures current-input-port
and
current-output-port
are called with an argument (which should
be a port), then that argument is selected as the new current input- and
output-port, respectively. The procedures open-input-file
,
open-output-file
, with-input-from-file
,
with-output-to-file
, call-with-input-file
and
call-with-output-file
accept an optional second (or third)
argument which should be one or more keywords, if supplied. These
arguments specify the mode in which the file is opened. Possible
values are the keywords #:text
, #:binary
or
#:append
.
Allows user-defined extension of external representations. (For more information see the documentation for SRFI-10)
Syntax for keywords. Keywords are symbols that evaluate to themselves, and as such don't have to be quoted.
Specifies a multiline string constant. Anything up to a line equal to
TAG
will be returned as a single string:(define msg #<<END "Hello, world!", she said. END )is equivalent to
(define msg "\"Hello, world!\", she said.")
Similar to
#<<
, but allows substitution of embedded Scheme expressions prefixed with#
and optionally enclosed in{ ... }
. Two consecutive#
s are translated to a single#
:(define three 3) (display #<#EOF This is a simple string with an embedded `##' character and substituted expressions: (+ three 99) ==> #(+ three 99) (three is "#{three}") EOF )prints
This is a simple string with an embedded `#' character and substituted expressions: (+ three 99) ==> 102 (three is "3")
Abbreviation for
(declare (foreign-declare " ... ") (foreign-parse " ... ") )
If occurring in the first line of an interpreted or compiled source file, then the
#!
and everything following it are ignored. If occurring anywhere else, reads as a normal symbol. The special (self-evaluating) symbol#!eof
is read as the end-of-file object.
(require-extension ID ...) (use ID ...)This form does all necessary steps to make the libraries or extensions given in
ID ...
available. It loads syntactic extension, if needed and generates code for loading/linking with core library modules or separately installed extensions.use
is just a shorter alias forrequire-extension
.During interpretation/evaluation
require-extension
performs one of the following:
- If
ID
names a built in featureschicken srfi-22 srfi-23 srfi-30 srfi-39 srfi-8 srfi-6 srfi-2 srfi-0 srfi-10 srfi-9
, then nothing is done.- If
ID
names one of syntactic extensionschicken-match-macros chicken-more-macros chicken-default-entry-points chicken-highlevel-macros test-infrastructure chicken-entry-points chicken-ffi-macros
, then this extension will be loaded.- If
ID
names one of the core library units shipped with CHICKEN, then a(load-library 'ID)
will be performed. If one of those libraries define specific syntax (match srfi-13
), then the required source file defining the syntax will be loaded.- If
ID
names an installed extension with thesyntax
orrequire-at-runtime
attribute, then the equivalent of(require-for-syntax 'ID)
is performed.- Otherwise
(require-extension ID)
is equivalent to(require 'ID)
.During compilation one of the following happens instead:
- If
ID
names a built in featureschicken srfi-22 srfi-23 srfi-30 srfi-39 srfi-8 srfi-6 srfi-2 srfi-0 srfi-10 srfi-9
, then nothing is done.- If
ID
names one of syntactic extensionschicken-match-macros chicken-more-macros chicken-default-entry-points chicken-highlevel-macros test-infrastructure chicken-entry-points chicken-ffi-macros
, then this extension will be loaded at compile-time, making the syntactic extensions available in compiled code.- If
ID
names one of the core library units shipped with CHICKEN, then a(declare (uses ID))
is generated. If one of those libraries define specific syntax (match srfi-13
), then the required source file defining the syntax will be loaded at compile-time, making the syntactic extension available in compiled code.- If
ID
names an installed extension with thesyntax
orrequire-at-runtime
attribute, then the equivalent of(require-for-syntax 'ID)
is performed.- Otherwise
(require-extension ID)
is equivalent to(require 'ID)
.To make long matters short - just use
require-extension
and it will normally figure everything out for dynamically loadable extensions and core library units.
(:optional ARGS DEFAULT)Use this form for procedures that take a single optional argument. If
ARGS
is the empty listDEFAULT
is evaluated and returned, otherwise the first element of the listARGS
. It is an error ifARGS
contains more than one value.(define (incr x . i) (+ x (:optional i 1))) (incr 10) ==> 11 (incr 12 5) ==> 17
(case-lambda (LAMBDA-LIST1 EXP1 ...) ...)SRFI-16. Expands into a lambda that invokes the body following the first matching lambda-list.
(define plus (case-lambda (() 0) ((x) x) ((x y) (+ x y)) ((x y z) (+ (+ x y) z)) (args (apply + args)))) (plus) ==> 9 (plus 1) ==> 1 (plus 1 2 3) ==> 6For more information see the documentation for SRFI-16
(let-optionals ARGS ((VAR1 DEFAULT1) ...) BODY ...) (let-optionals* ARGS ((VAR1 DEFAULT1) ... [RESTVAR]) BODY ...)Binding constructs for optional procedure arguments.
ARGS
should be a rest-parameter taken from a lambda-list.let-optionals
bindsVAR1 ...
to available arguments in parallel, or toDEFAULT1 ...
if not enough arguments were provided.let-optionals*
bindsVAR1 ...
sequentially, so every variable sees the previous ones. If a single variableRESTVAR
is given, then it is bound to any remaining arguments, otherwise it is an error if any excess arguments are provided.(let-optionals '(one two) ((a 1) (b 2) (c 3)) (list a b c) ) ==> (one two 3) (let-optionals* '(one two) ((a 1) (b 2) (c a)) (list a b c) ) ==> (one two one)
(and-let* (BINDING ...) EXP1 EXP2 ...)SRFI-2. Bind sequentially and execute body.
BINDING
can be a list of a variable and an expression, a list with a single expression, or a single variable. If the value of an expression bound to a variable is#f
, theand-let*
form evaluates to#f
(and the subsequent bindings and the body are not executed). Otherwise the next binding is performed. If all bindings/expressions evaluate to a true result, the body is executed normally and the result of the last expression is the result of theand-let*
form. See also the documentation for SRFI-2.
(define-values (NAME ...) EXP)Defines several variables at once, with the result values of expression
EXP
.
(fluid-let ((VAR1 X1) ...) BODY ...)Binds the variables
VAR1 ...
dynamically to the valuesX1 ...
during execution ofBODY ...
.
(let-values (((NAME ...) EXP) ...) BODY ...)Binds multiple variables to the result values of
EXP ...
. All variables are bound simultaneously.
(let*-values (((NAME ...) EXP) ...) BODY ...)Binds multiple variables to the result values of
EXP ...
. The variables are bound sequentially.(let*-values (((a b) (values 2 3)) ((p) (+ a b)) ) p) ==> 5
(letrec-values (((NAME ...) EXP) ...) BODY ...)Binds the result values of
EXP ...
to multiple variables at once. All variables are mutually recursive.(letrec-values (((odd even) (values (lambda (n) (if (zero? n) #f (even (sub1 n)))) (lambda (n) (if (zero? n) #t (odd (sub1 n)))) ) ) ) (odd 17) ) ==> #t
(parameterize ((PARAMETER1 X1) ...) BODY ...)Binds the parameters
PARAMETER1 ...
dynamically to the valuesX1 ...
during execution ofBODY ...
. (see also:make-parameter
in Parameters). Note thatPARAMETER
may be any expression that evaluates to a parameter procedure.
(receive (NAME1 ... [. NAMEn]) VALUEEXP BODY ...) (receive VALUEEXP)SRFI-8. Syntactic sugar for
call-with-values
. Binds variables to the result values ofVALUEEXP
and evaluatesBODY ...
.The syntax
(receive VALUEEXP)is equivalent to
(receive _ VALUEEXP _)
(set!-values (NAME ...) EXP)Assigns the result values of expression
EXP
to multiple variables.
(define-constant NAME CONST)Define a variable with a constant value, evaluated at compile-time. Any reference to such a constant should appear textually after its definition. This construct is equivalent to
define
when evaluated or interpreted. Constant definitions should only appear at toplevel. Note that constants are local to the current compilation unit and are not available outside of the source file in which they are defined. Names of constants still exist in the Scheme namespace and can be lexically shadowed. If the value is mutable, then the compiler is careful to preserve its identity.CONST
may be any constant expression, and may also refer to constants defined viadefine-constant
previously. This for should only be used at top-level.
(define-inline (NAME VAR ... [. VAR]) BODY ...) (define-inline NAME EXP)Defines an inline procedure. Any occurrence of
NAME
will be replaced byEXP
or(lambda (VAR ... [. VAR]) BODY ...)
. This is similar to a macro, but variable-names and -scope will be correctly handled. Inline substitutions take place after macro-expansion.EXP
should be a lambda-expression. Any reference toNAME
should appear textually after its definition. Note that inline procedures are local to the current compilation unit and are not available outside of the source file in which they are defined. Names of inline procedures still exist in the Scheme namespace and can be lexically shadowed. This construct is equivalent todefine
when evaluated or interpreted. Inline definitions should only appear at toplevel.
(define-macro (NAME VAR ... [. VAR]) EXP1 ...) (define-macro NAME (lambda (VAR ... [. VAR]) EXP1 ...)) (define-macro NAME1 NAME2)Define a globally visible macro special form. The macro is available as soon as it is defined, i.e. it is registered at compile-time. If the file containing this definition invokes
eval
and the declarationrun-time-macros
(or the command line option-run-time-macros
) has been used, then the macro is visible in evaluated expressions during runtime. The second possible syntax fordefine-macro
is allowed for portability purposes only. In this case the second argument must be a lambda-expression or a macro name. Only global macros can be defined using this form.(define-macro NAME1 NAME2)
simply copies the macro definition fromNAME2
toNAME1
, creating an alias.This form is also available with the
syntax-case
macro system.
(switch EXP (KEY EXP1 ...) ... [(else EXPn ...)])This is similar to
case
, but a) only a single key is allowed, and b) the key is evaluated.
(define-record NAME SLOTNAME ...)Defines a record type. Call
make-NAME
to create an instance of the structure (with one initialization-argument for each slot).(NAME? STRUCT)
tests any object for being an instance of this structure. Slots are accessed via(NAME-SLOTNAME STRUCT)
and updated using(NAME-SLOTNAME-set!
STRUCT
VALUE)
.(define-record point x y) (define p1 (make-point 123 456)) (point? p1) ==> #t (point-x p1) ==> 123 (point-y-set! p1 99) (point-y p1) ==> 99
(define-record-printer (NAME RECORDVAR PORTVAR) BODY ...) (define-record-printer NAME PROCEDURE)Defines a printing method for record of the type
NAME
by associating a procedure with the record type. When a record of this type is written usingdisplay, write
or(define-record foo x y z) (define f (make-foo 1 2 3)) (define-record-printer (foo x out) (fprintf out "#,(foo ~S ~S ~S)" (foo-x x) (foo-y x) (foo-z x)) ) (define-reader-ctor 'foo make-foo) (define s (with-output-to-string (lambda () (write f)))) s ==> "#,(foo 1 2 3)" (equal? f (with-input-from-string s read))) ==> #t
define-record-printer
works also with SRFI-9 record types.
(define-record-type NAME (CONSTRUCTOR TAG ...) PREDICATE (FIELD ACCESSOR [MODIFIER]) ...)SRFI-9 record types. For more information see the documentation for SRFI-9
(assert EXP [STRING ARG ...])Signal error if
EXP
evaluates to false. An optional messageSTRING
and argumentsARG ...
may be supplied to give a more informative error-message. If compiled in unsafe mode (either by specifying the-unsafe
compiler option or by declaring(unsafe)
), then this expression expands to an unspecified value.
(cond-expand FEATURE-CLAUSE ...)SRFI-0. Expands by selecting feature clauses. Predefined feature-identifiers are
srfi-0
,srfi-2
,srfi-6
,srfi-8
,srfi-9
,srfi-10
, andchicken
. Instrict-srfi-0
mode onlysrfi-0
andchicken
are defined. If the source file containing this form is currently compiled, the featurecompiling
is defined. For further information, see the documentation for SRFI-0 This form is allowed to appear in non-toplevel expressions.
(critical-section BODY ...)Evaluate
BODY ...
with timer-interrupts temporarily disabled.
(ensure PREDICATE EXP [ARGUMENTS ...])Evaluates the expression
EXP
and applies the one-argument procedurePREDICATE
to the result. If the predicate returns#f
an error is signaled, otherwise the result ofEXP
is returned. If compiled in unsafe mode (either by specifying the-unsafe
compiler option or by declaring(unsafe)
), then this expression expands to an unspecified value. If specified, the optionalARGUMENTS
are used as arguments to the invocation of the error-signalling code, as in(error ARGUMENTS ...)
. If noARGUMENTS
are given, a generic error message is displayed with the offending value andPREDICATE
expression.
(eval-when (SITUATION ...) EXP ...)Controls evaluation/compilation of subforms.
SITUATION
should be one of the symbolseval
,compile
orload
. When encountered in the evaluator, and the situation specifiereval
is not given, then this form is not evaluated and an unspecified value is returned. When encountered while compiling code, and the situation specifiercompile
is given, then this form is evaluated at compile-time. When encountered while compiling code, and the situation specifierload
is not given, then this form is ignored and an expression resulting into an unspecified value is compiled instead.The following table should make this clearer:
in compiled code In interpreted code eval
ignore evaluate compile
evaluate at compile time ignore load
compile as normal ignore Note: It is currently not possible to use
define-syntax
ordefine
insideeval-when
forms when hygienic macros are enabled.
(include STRING)Include toplevel-expressions from the given source file in the currently compiled/interpreted program. If the included file has the extension
.scm
, then it may be omitted. The file is searched in the current directory and, if not found, in all directories specified in the-include-path
option.
(nth-value N EXP)Returns the
N
th value (counting from zero) of the values returned by expressionEXP
.
(time EXP1 ...)Evaluates
EXP1 ...
and print elapsed time and memory information. The result of the last expression is returned.
(declare DECLSPEC ...)Process declaration specifiers. Declarations always override any command-line settings. Declarations are valid for the whole compilation-unit (source file), the position of the declaration in the source file can be arbitrary.
DECLSPEC
may be any of the following:— declaration specifier: always-bound
(always-bound SYMBOL ...)Declares that the given variables are always bound and accesses to those have not to be checked.
— declaration specifier: block
(block)Assume global variables are never redefined. This is the same as specifying the
-block
option.— declaration specifier: block-global
— declaration specifier: hide
(block-global SYMBOL ...) (hide SYMBOL ...)Declares that the toplevel bindings for
SYMBOL ...
should not be accessible from code in other compilation units or byeval
. Access to toplevel bindings declared as block global is also more efficient.— declaration specifier: bound-to-procedure
(bound-to-procedure SYMBOL ...)Declares that the given identifiers are always bound to procedure values.
— declaration specifier: compress-literals
(compress-literals [THRESHOLD [INITIALIZER]])The same as the
-compress-literals
compiler option. The threshold argument defaults to 50. If the optional argumentINITIALIZER
is given, then the literals will not be created at module startup, but when the procedure with this name will be called.— declaration specifier: export
(export SYMBOL ...)The opposite of
hide
. All given identifiers will be exported and all toplevel variables not listed will be hidden and not be accessible outside of this compilation unit. When the hygienic (syntax-case
) macro system is used, the exported identifier may also have the form(MODULE-NAME SYMBOL ...)
, which specifies identifiers to be exported from a module as (undecorated) toplevel variables.— declaration specifier: foreign-declare
(foreign-declare STRING ...)Include given strings verbatim into header of generated file.
— declaration specifier: foreign-parse
(foreign-parse STRING ...)Parse given strings and generate foreign-interface bindings. See The Easy Foreign Function Interface for more information.
— declaration specifier: interrupts-enabled
(interrupts-enabled)Enable timer-interrupts checks in the compiled program (the default).
— declaration specifier: disable-interrupts
— declaration specifier: not
(disable-interrupts) (not interrupts-enabled)Disable timer-interrupts checks in the compiled program. Threads can not be preempted in main- or library-units that contain this declaration.
— declaration specifier: no-bound-checks
(no-bound-checks)Disables the bound-checking of toplevel bindings.
— declaration specifier: no-procedure-checks
(no-procedure-checks)Disables checking of values in operator position for being of procedure type.
— declaration specifier: TYPE
— declaration specifier: fixnum-arithmetic
([number-type] TYPE) (fixnum-arithmetic)Declares that only numbers of the given type are used.
TYPE
may befixnum
orgeneric
(which is the default).— declaration specifier: run-time-macros
(run-time-macros)Equivalent to the compiler option of the same name - low-level macros defined in the compiled code are also made available at runtime.
— declaration specifier: standard-bindings
([not] standard-bindings SYMBOL ...)Declares that all given standard procedures (or all if no symbols are specified) are never globally redefined. If
not
is specified, then all but the given standard bindings are assumed to be never redefined.— declaration specifier: extended-bindings
([not] extended-bindings SYMBOL ...)Declares that all given non-standard and CHICKEN-specific procedures (or all if no symbols are specified) are never globally redefined. If
not
is specified, then all but the given extended bindings are assumed to be never redefined.— declaration specifier: usual-integrations
([not] usual-integrations SYMBOL ...)Declares that all given standard and extended bindings (or all if no symbols are specified) are never globally redefined. If
not
is specified, then all but the given standard and extended bindings are assumed to be never redefined.— declaration specifier: unsafe
— declaration specifier: not
(unsafe) (not safe)Do not generate safety-checks. This is the same as specifying the
-unsafe
option. Also implies(declare (no-bound-checks) (no-procedure-checks) (no-argc-checks))— declaration specifier: uses
(uses SYMBOL ...)Gives a list of used library-units. Before the toplevel-expressions of the main-module are executed, all used units evaluate their toplevel-expressions in the order in which they appear in this declaration. If a library unit A uses another unit B, then B's toplevel expressions are evaluated before A's. Furthermore, the used symbols are registered as features during compile-time, so
cond-expand
knows about them.
Certain behavior of the interpreter and compiled programs can be customized via 'parameters', where a parameter is a procedure of zero or one arguments. To retrieve the value of a parameter call the parameter-procedure with zero arguments. To change the setting of the parameter, call the parameter-procedure with the new value as argument:
(define foo (make-parameter 123)) (foo) ==> 123 (foo 99) (foo) ==> 99
Parameters are fully thread-local, each thread of execution owns a local copy of a parameters' value.
CHICKEN implements SRFI-39
(make-parameter VALUE [GUARD])Returns a procedure that accepts zero or one argument. Invoking the procedure with zero arguments returns
VALUE
. Invoking the procedure with one argument changes its value to the value of that argument (subsequent invocations with zero parameters return the new value).GUARD
should be a procedure of a single argument. Any new values of the parameter (even the initial value) are passed to this procedure. The guard procedure should check the value and/or convert it to an appropriate form.
If true, then
read
reads symbols and identifiers in case-sensitive mode and uppercase characters in symbols are printed escaped. Defaults to#t
.
A list of strings containing shared libraries that should be checked for explicitly loaded library units (this facility is not available on all platforms). See
load-library
.
Contains the list of arguments passed to this program, with the name of the program and any runtime options (all options starting with
-:
) removed.
A procedure of a single optional argument. When
exit
is called, then this procedure will be invoked with the exit-code as argument. The default behavior is to terminate the program.
A procedure of one or two arguments. When
eval
is invoked, it calls the value of this parameter with the same arguments. The default behavior is to evaluate the argument expression and to ignore the second parameter.
If true, force and execute all pending finalizers before exiting the program (either explicitly by
exit
or implicitly when the last toplevel expression has been executed). Default is#t
.
A procedure of no arguments. When the last toplevel expression of the program has executed, then the value of this parameter is called. The default behaviour is to do nothing, or, if one or more entry-points were defined (see: Entry points) to enter a loop that waits for callbacks from the host program.
Enables alternative keyword syntax, where
STYLE
may be either#:prefix
(as in Common Lisp) or#:suffix
(as in DSSSL). Any other value disables the alternative syntaxes.
A boolean indicating whether loading of source files, compiled code (if available) and compiled libraries should display a message.
A string that will be printed before reading interactive input from the user in a read-eval-print loop. Defaults to
"#;> "
.
A procedure of zero arguments that is called via
reset
. The default behavior in compiled code is to invoke the value of(exit-handler)
. The default behavior in the interpreter is to abort the current computation and to restart the read-eval-print loop.
This unit contains basic Scheme definitions. This unit is used by default, unless the program
is compiled with the -explicit-use
option.
(bitwise-and N1 ...) (bitwise-ior N1 ...) (bitwise-xor N1 ...) (bitwise-not N) (arithmetic-shift N1 N2)Binary fixnum operations.
arithmetic-shift
shifts the argumentN1
byN2
bits to the left. IfN2
is negative, thanN1
is shifted to the right.
(fx+ N1 N2) (fx- N1 N2) (fx* N1 N2) (fx/ N1 N2) (fxmod N1 N2) (fxneg N) (fxmin N1 N2) (fxmax N1 N2) (fx= N1 N2) (fx> N1 N2) (fx< N1 N2) (fx>= N1 N2) (fx<= N1 N2)Arithmetic fixnum operations. These procedures do not check their arguments, so non-fixnum parameters will result in incorrect results.
fxneg
negates its argument.On division by zero,
fx/
andfxmod
signal a condition of kind(exn arithmetic)
.
(current-error-port [PORT])Returns default error output port. If
PORT
is given, then that port is selected as the new current error output port.
(flush-output [PORT])Write buffered output to the given output-port.
PORT
defaults to the value of(current-output-port)
.
(port-name PORT)Fetch filename from
PORT
. This returns the filename that was used to open this file. Returns a special tag string, enclosed into parentheses for non-file ports.
(port-position PORT)Returns the current position of
PORT
as two values: row and column number. If the port does not support such an operation an error is signaled. This procedure is currently only available for input ports.
(delete-file STRING)Deletes the file with the pathname
STRING
. If the file does not exist, an error is signaled.
(file-exists? STRING)Returns
#t
if a file with the given pathname exists, or#f
otherwise.
Contains the directory-separator character for pathnames on this platform.
Contains the extension-separator character for pathnames on this platform.
(rename-file OLD NEW)Renames the file or directory with the pathname
OLD
toNEW
. If the operation does not succeed, an error is signaled.
(get-output-string PORT)Returns accumulated output of a port created with
(open-output-string)
.
(open-output-string)Returns a port for accumulating output in a string.
(features)Returns a list of all registered features that will be accepted as valid feature-identifiers by
cond-expand
.
(register-feature! FEATURE ...)Register one or more features that will be accepted as valid feature-identifiers by
cond-expand
.FEATURE ...
may be a keyword, string or symbol.
(unregister-feature! FEATURE ...)Unregisters the specified feature-identifiers.
FEATURE ...
may be a keyword, string or symbol.
Keywords are special symbols prefixed with #:
that evaluate
to themselves. Procedures can use keywords to accept optional named
parameters in addition to normal required parameters. Assignment to
and bindings of keyword symbols is not allowed.
The parameter keyword-style
and the compiler/interpreter option
-keyword-style
can be used to allow an additional keyword
syntax, either compatible to Common LISP, or to DSSSL.
(get-keyword KEYWORD ARGLIST [THUNK])Returns the argument from
ARGLIST
specified under the keywordKEYWORD
. If the keyword is not found, then the zero-argument procedureTHUNK
is invoked and the result value is returned. IfTHUNK
is not given,#f
is returned.(define (increase x . args) (+ x (get-keyword #:amount args (lambda () 1))) ) (increase 123) ==> 124 (increase 123 #:amount 10) ==> 133Note: the
KEYWORD
may actually be any kind of object.
CHICKEN implements the (currently withdrawn) SRFI-12 exception system. For more information, see the SRFI-12 document
(condition-case EXPRESSION CLAUSE ...)Evaluates
EXPRESSION
and handles any exceptions that are covered byCLAUSE ...
, whereCLAUSE
should be of the following form:CLAUSE = ([VARIABLE] (KIND ...) BODY ...)If provided,
VARIABLE
will be bound to the signalled exception object.BODY ...
is executed when the exception is a property- or composite condition with the kinds givenKIND ...
(unevaluated). If no clause applies, the exception is re-signalled in the same dynamic context as thecondition-case
form.(define (check thunk) (condition-case (thunk) [(exn file) (print "file error")] [(exn) (print "other error")] [var () (print "something else")] ) ) (check (lambda () (open-input-file ""))) ; -> "file error" (check (lambda () some-unbound-variable)) ; -> "othererror" (check (lambda () (signal 99))) ; -> "something else" (condition-case some-unbound-variable [(exn file) (print "ignored)] ) ; -> signals error
All error-conditions signalled by the system are of kind exn
.
The following composite conditions are additionally defined:
(exn arity)
(exn type)
(exn arithmetic)
(exn i/o)
(exn i/o file)
(exn i/o net)
(exn bounds)
(exn runtime)
(exn runtime limit)
(exn match)
match
).
(exn syntax)
Notes:
exn
) are non-continuable.
exn
kind have additional
arguments
and location
properties that contain the
arguments passed to the error-handler and the name of the procedure
where the error occurred (if available).
posix
unit is available and used, then a
user-interrupt (signal/int
) signals an exception of the kind
user-interrupt
.
condition-property-accessor
accepts an optional
third argument. If the condition does not have a value for the desired property
and if the optional argument is given and false, no error is signalled and
the accessor returns #g
.
(argv)Return a list of all supplied command-line arguments. The first item in the list is a string containing the name of the executing program. The other items are the arguments passed to the application. This list is freshly created on every invocation of
(argv)
. It depends on the host-shell whether arguments are expanded ('globbed') or not.
(exit [CODE])Exit the running process and return exit-code, which defaults to 0 (Invokes
exit-handler
).
(build-platform)Returns a symbol specifying the toolset which has been used for building the executing system, which is one of the following:
djgpp cygwin msvc mingw32 gnu metrowerks unknown
(chicken-version)Returns a string containing the version number of the CHICKEN runtime system.
(getenv STRING)Returns the value of the environment variable
STRING
or#f
if that variable is not defined.
(machine-type)Returns a symbol specifying the processor on which this process is currently running, which is one of the following:
alpha mips hppa ultrasparc sparc ppc ia64 x86 x86-64 unknown
(software-type)Returns a symbol specifying the operating system on which this process is currently running, which is one of the following:
msdos windows unix macos unknown
(software-version)Returns a symbol specifying the operating system version on which this process is currently running, which is one of the following:
linux freebsd netbsd openbsd macosx hpux solaris sunos unknown
(system STRING)Execute shell command. The functionality offered by this procedure depends on the capabilities of the host shell.
(cpu-time)Returns the used CPU time of the current process in milliseconds as two values: the time spent in user code, and the time spent in system code. On platforms where user and system time can not be differentiated, system time will be always be 0.
(current-milliseconds)Returns the number of milliseconds since process- or machine startup.
(current-seconds)Returns the number of seconds since midnight, Jan. 1, 1970.
(enable-interrupts) (disable-interrupts)Enables/disables processing of timer-interrupts and interrupts caused by signals.
(disable-interrupts) (disable-interrupts) (enable-interrupts) ; <interrupts still disabled - call enable-interrupts once more>
(enable-warnings [BOOL])Enables or disables warnings, depending on wether
BOOL
is true or false. If called with no arguments, this procedure returns#t
if warnings are currently enabled, or#f
otherwise. Note that this is not a parameter. The current state (wether warnings are enabled or disabled) is global and not thread-local.
(error [LOCATION] STRING EXP ...)Prints error message, writes all extra arguments to the value of
(current-error-port)
and invokes the current value of(error-handler)
. This conforms to SRFI-23. IfLOCATION
is given and a symbol, it specifies the “location” (the name of the procedure) where the error occurred.
(print-backtrace [PORT])Prints a backtrace of the procedure call history to
PORT
, which defaults to(current-error-port)
. Backtrace information is only generated in compiled code, with a-debug-level
>= 1.
(print-error-message EXN [PORT [STRING]])Prints an appropriate error message to
PORT
(which defaults to the value of(current-error-port)
for the objectEXN
.EXN
may be a condition, a string or any other object. If the optional argumentSTRING
is given, it is printed before the error-message.STRING
defaults to"Error:"
.
(gc [FLAG])Invokes a garbage-collection and returns the number of free bytes in the heap. The flag specifies whether a minor (
#f
) or major (#t
) GC is to be triggered. If no argument is given,#t
is assumed. When the argument is#t
, all pending finalizers are executed.— procedure: memory-statistics
(memory-statistics)Performs a major garbage collection and returns a three element vector containing the total heap size in bytes, the number of bytes currently used and the size of the nursery (the first heap generation). Note that the actual heap is actually twice the size given in the heap size, because CHICKEN uses a copying semi-space collector.
(set-finalizer! X PROC)Registers a procedure of one argument
PROC
, that will be called as soon as the non-immediate data objectX
is about to be garbage-collected (with that object as its argument). Note that the finalizer will not be called when interrupts are disabled.
(set-gc-report! FLAG)Print statistics after every GC, depending on
FLAG
. A value of#t
shows statistics after every major GC. A true value different from#t
shows statistics after every minor GC.#f
switches statistics off.
(andmap PROC LIST1 ...)Repeatedly calls
PROC
with arguments taken fromLIST1 ...
. If any invocation should return#f
, the result ofandmap
is#f
. If all invocations return a true result, then the result ofandmap
is#t
.
(ormap PROC LIST1 ...)Repeatedly calls
PROC
with arguments taken fromLIST1 ...
. If any invocation should return a value different from#f
, then this value is returned as the result oformap
. If all invocations return #f, then the result oformap
is#f
.
(reverse-list->string LIST)Returns a string with the characters in
LIST
in reverse order. This is equivalent to(list->string (reverse LIST))
, but much more efficient.
(gensym [STRING-OR-SYMBOL])Returns a newly created uninterned symbol. If an argument is provided, the new symbol is prefixed with that argument.
(string->uninterned-symbol STRING)Returns a newly created, unique symbol with the name
STRING
.
(print EXP1 EXP2 ...)Outputs the arguments
EXP1 EXP2 ...
usingdisplay
and writes a newline character to the port that is the value of(current-output-port)
. Returns its first argument.
(print* EXP1 ...)Similar to
(char-name SYMBOL-OR-CHAR [CHAR])This procedure can be used to inquire about character names or to define new ones. With a single argument the behavior is as follows: If
SYMBOL-OR-CHAR
is a symbol, thenchar-name
returns the character with this name, or#f
if no character is defined under this name. IfSYMBOL-OR-CHAR
is a character, then the name of the character is returned as a symbol, or#f
if the character has no associated name.If the optional argument
CHAR
is provided, thenSYMBOL-OR-CHAR
should be a symbol that will be the new name of the given character. If multiple names designate the same character, then thewrite
will use the character name that was defined last.(char-name 'space) ==> #\space (char-name #\space) ==> space (char-name 'bell) ==> #f (char-name (integer->char 7)) ==> #f (char-name 'bell (integer->char 7)) (char-name 'bell) ==> #\bell (char->integer (char-name 'bell)) ==> 7
(vector-copy! VECTOR1 VECTOR2 [COUNT])Copies contents of
VECTOR1
intoVECTOR2
. If the argumentCOUNT
is given, it specifies the maximal number of elements to be copied. If not given, the minimum of the lengths of the argument vectors is copied.Exceptions:
(exn bounds)
(vector-resize VECTOR N [INIT])Creates and returns a new vector with the contents of
VECTOR
and lengthN
. IfN
is greater than the original length ofVECTOR
, then all additional items are initialized toINIT
. IfINIT
is not specified, the contents are initialized to some unspecified value.
This unit has support for evaluation and macro-handling. This unit is used
by default, unless the program is compiled with the -explicit-use
option.
(load FILE [EVALPROC])Loads and evaluates expressions from the given source file, which may be either a string or an input port. Each expression read is passed to
EVALPROC
(which defaults toeval
). On platforms that support it (currently Linux ELF and Solaris),load
can be used to load compiled programs:% cat x.scm (define (hello) (print "Hello!")) % chicken x.scm -quiet -dynamic % gcc x.c -shared -fPIC `chicken-config -cflags -shared -libs` -o x.so % csi -quiet #;> (load "x.so") ; loading x.so ... #;> (hello) Hello! #;>The second argument to
load
is ignored when loading compiled code. The same compiled object file can not be loaded more than once. If source code is loaded from a port, then that port is closed after all expressions have been read.
(load-library UNIT [LIBRARYFILE])On platforms that support dynamic loading,
load-library
loads the compiled library unitUNIT
(which should be a symbol). If the stringLIBRARYFILE
is given, then the given shared library will be loaded and the toplevel code of the contained unit will be executed. If noLIBRARYFILE
argument is given, then the following libraries are checked for the required unit:
- a file named “
<UNIT>.so
”- the files given in the parameter
dynamic-load-libraries
If the unit is not found, an error is signaled. When the library unit can be successfully loaded, a feature-identifier named
UNIT
is registered. If the feature is already registered before loading, theload-library
does nothing.
(load-noisily FILE [EVALPROC])As
load
but the result(s) of each evaluated toplevel-expression is written to standard output.
(repl)Start a new read-eval-print loop. Sets the
reset-handler
so that any invocation ofreset
restarts the read-eval-print loop. Also changes the currenterror-handler
to display a message, write any arguments to the value of(current-error-port)
and reset.
(get-line-number EXPR)If
EXPR
is a pair with the car being a symbol, and line-number information is available for this expression, then this procedure returns the associated line number. If line-number information is not available, then#f
is returned. Note that line-number information for expressions is only available in the compiler.
(macroexpand X)If
X
is a macro-form, expand the macro (and repeat expansion until expression is a non-macro form). Returns the resulting expression.
(macroexpand-1 X)If
X
is a macro-form, expand the macro. Returns the resulting expression.
(undefine-macro! SYMBOL)Remove the current macro-definition of the macro named
SYMBOL
.
(syntax-error [LOCATION] MESSAGE ARGUMENT ...)Signals an exception of the kind
(exn syntax)
. Otherwise identical toerror
.
This functionality is only available on platforms that support dynamic loading of compiled code. Currently Linux, BSD, Solaris, Windows (with Cygwin) and HP/UX are supported.
Contains a string naming the path to the extension repository, which defaults to either the value of the environment variable
CHICKEN_REPOSITORY
, the value of the environment variableCHICKEN_HOME
or the default library path (usually/usr/local/lib/chicken
on UNIX systems.
(extension-info ID)If an extension with the name
ID
is installed and if it has a setup-information list registered in the extension repository, then the info-list is returned. Otherwiseextension-info
returns#f
.
(provide ID ...)Registers the extension IDs
ID ...
as loaded. This is mainly intended to provide aliases for certain extension identifiers.
(provided? ID ...)Returns
#t
if the extension with the IDsID ...
are currently loaded, or#f
otherwise. Works also for feature-ids.
(require ID ...)If the extension library
ID
is not already loaded into the system, thenrequire
will lookup the location of the shared extension library and load it. IfID
names a library-unit of the base system, then it is loaded viaload-library
. If no extension library is available for the given ID, then an attempt is made to load the fileID.so
orID.scm
(in that order) from one of the following locations:
- the current directory
- the current include path, which defaults to the pathnames given in
CHICKEN_INCLUDE_PATH
andCHICKEN_HOME
. In caseID
is a list, it is interpreted as a (relative) pathname.
ID
may be a symbol, or a list of symbols. See also:require-for-syntax
.
(define-reader-ctor SYMBOL PROC)Define new read-time constructor for
#,
read syntax. For further information, see the documentation for SRFI-10.
(set-read-syntax! CHAR PROC)When the reader is encounting the non-whitespace character
CHAR
while reading an expression from a given port, then the procedurePROC
will be called with that port as its argument. The procedure should return a value that will be returned to the reader:; A simple RGB color syntax: (set-read-syntax! #\% (lambda (port) (apply vector (map (cut string->number <> 16) (string-chop (read-string 6 port) 2) ) ) ) ) (with-input-from-string "(1 2 %e0e0e0 3)" read) ; ==> (1 2 #(240 240 240) 3)
(eval EXP [ENVIRONMENT])Evaluates
EXP
and returns the result of the evaluation. The second argument is optional and defaults to the value of(interaction-environment)
.
This unit contains a collection of useful utility definitions.
This unit is used by default, unless the program
is compiled with the -explicit-use
option.
(alist-ref KEY ALIST [TEST [DEFAULT]])Looks up
KEY
inALIST
usingTEST
as the comparison function (oreqv?
if no test was given) and returns the cdr of the found pair, orDEFAULT
(which defaults to#f
).
(alist-update! KEY VALUE ALIST [TEST])If the list
ALIST
contains a pair of the form(KEY . X)
, then this procedure replacesX
withVALUE
and returnsALIST
. IfALIST
contains no such item, thenalist-update!
returns((KEY . VALUE) . ALIST)
. The optional argumentTEST
specifies the comparison procedure to search a matching pair inALIST
and defaults toeqv?
.
(chop LIST N)Returns a new list of sublists, where each sublist contains
N
elements ofLIST
. IfLIST
has a length that is not a multiple ofN
, then the last sublist contains the remaining elements.(chop '(1 2 3 4 5 6) 2) ==> ((1 2) (3 4) (5 6)) (chop '(a b c d) 3) ==> ((a b c) (d))
(compress BLIST LIST)Returns a new list with elements taken from
LIST
with corresponding true values in the listBLIST
.(define nums '(99 100 110 401 1234)) (compress (map odd? nums) nums) ==> (99 401)
(flatten LIST1 ...)Returns
LIST1 ...
concatenated together, with nested lists removed (flattened).
(intersperse LIST X)Returns a new list with
X
placed between each element.
(join LISTOFLISTS [LIST])Concatenates the lists in
LISTOFLISTS
withLIST
placed between each sublist.LIST
defaults to the empty list.(join '((a b) (c d) (e)) '(x y)) ==> (a b x y c d x y e) (join '((p q) () (r (s) t)) '(-)) ==> (p q - - r (s) t)
(shuffle LIST)Returns
LIST
with its elements sorted in a random order.
join
could be implemented as follows:(define (join lstoflsts . lst) (apply append (intersperse lstoflists (:optional lst '()))) )
(call-with-input-string STRING PROC)Calls the procedure
PROC
with a single argument that is a string-input-port with the contents ofSTRING
.
(call-with-output-string PROC)Calls the procedure
PROC
with a single argument that is a string-output-port. Returns the accumulated output-string.
(with-input-from-string STRING THUNK)Call procedure
THUNK
with the current input-port temporarily bound to an input-string-port with the contents ofSTRING
.
(with-output-to-string THUNK)Call procedure
THUNK
with the current output-port temporarily bound to a string-output-port and return the accumulated output string.
(fprintf PORT FORMATSTRING ARG ...) (printf FORMATSTRING ARG) (sprintf FORMATSTRING ARG ...)Simple formatted output to a given port (
fprintf
), the value of(current-output-port)
(printf
) or a string (sprintf
). TheFORMATSTRING
can contain any sequence of characters. The character `~' prefixes special formatting directives:
~%
- write newline character
~S
- write the next argument
~A
- display the next argument
~\n
- skip all whitespace in the format-string until the next non-whitespace character
~B
- write the next argument as a binary number
~O
- write the next argument as an octal number
~X
- write the next argument as a hexadecimal number
~C
- write the next argument as a character
~~
- display `~'
~!
- flush all pending output
~?
- invoke formatted output routine recursively with the next two arguments as format-string and list of parameters
For more powerful output formatting, see the section about the
format
unit.
(clear-hash-table! HASH-TABLE)Erases all entries in the hash-table
HASH-TABLE
.
(get HASH-TABLE KEY PROP)Returns the value of property
PROP
of the itemKEY
inHASH-TABLE
. This facility can be used as a kind of “disembodied” property-list. If no entry namedKEY
is stored in the hash-table or if no propertyPROP
for that key exists,#f
is returned.
(hash-table->list HASH-TABLE)Converts
HASH-TABLE
into an association-list.
(hash-table-count HASH-TABLE)Returns the number of entries in the given hash-table.
(hash-table-for-each PROC HASH-TABLE)Calls
PROC
which should expect two arguments. This procedure is called for each entry in the hash-table with the key and the value as parameters.
(hash-table-ref HASH-TABLE KEY [DEFAULT])Returns the entry in the given hash-table under
KEY
. If no entry is stored in the table,#f
is returned.
(hash-table-remove! HASH-TABLE KEY)Removes an entry in the given hash-table.
(hash-table-set! HASH-TABLE KEY VALUE)Adds or changes an entry in the given hash-table.
(make-hash-table [PRED [SIZE]])Creates and returns a hash-table with keys compared via
PRED
, which defaults toeq?
. IfSIZE
is provided it specifies the initial size of the hash-table. If the hash-table fills above a certain size it is automatically resized to accommodate more entries.
(put! HASH-TABLE KEY PROP VALUE)Stores
VALUE
as propertyPROP
under the itemKEY
in the given hash-table. Any previously existing value is overwritten.
(list->queue LIST)Returns
LIST
converted into a queue, where the first element of the list is the same as the first element of the queue. The resulting queue may share memory with the list and the list should not be modified after this operation.
(queue->list QUEUE)Returns
QUEUE
converted into a list, where the first element of the list is the same as the first element of the queue. The resulting list may share memory with the queue object and should not be modified.
(queue-first QUEUE)Returns the first element of
QUEUE
. IfQUEUE
is empty an error is signaled
(queue-last QUEUE)Returns the last element of
QUEUE
. IfQUEUE
is empty an error is signaled
(queue-remove! QUEUE)Removes and returns the first element of
QUEUE
. IfQUEUE
is empty an error is signaled
(merge LIST1 LIST2 LESS?) (merge! LIST1 LIST2 LESS?)Joins two lists in sorted order.
merge!
is the destructive version of merge.LESS?
should be a procedure of two arguments, that returns true if the first argument is to be ordered before the second argument.
(sort SEQUENCE LESS?) (sort! SEQUENCE LESS?)Sort
SEQUENCE
, which should be a list or a vector.sort!
is the destructive version of sort.
(sorted? SEQUENCE LESS?)Returns true if the list or vector
SEQUENCE
is already sorted.
(randomize [X])Set random-number seed. If
X
is not supplied, the current time is used. On startup (when theextras
unit is initialized), the random number generator is initialized with the current time.
(make-input-port READ READY? CLOSE [PEEK])Returns a custom input port. Common operations on this port are handled by the given parameters, which should be procedures of no arguments.
READ
is called when the next character is to be read and should return a character or the value of(end-of-file)
.READY?
is called whenchar-ready?
is called on this port and should return#t
or#f
.CLOSE
is called when the port is closed.PEEK
is called whenpeek-char
is called on this port and should return a character or the value of(end-of-file)
. if the argumentPEEK
is not given, thenREAD
is used instead and the created port object handles peeking automatically (by callingREAD
and buffering the character).
(make-output-port WRITE CLOSE [FLUSH])Returns a custom output port. Common operations on this port are handled by the given parameters, which should be procedures.
WRITE
is called when output is sent to the port and receives a single argument, a string.CLOSE
is called when the port is closed and should be a procedure of no arguments.FLUSH
(if provided) is called for flushing the output port.
(pretty-print EXP [PORT]) (pp EXP [PORT])Print expression nicely formatted.
PORT
defaults to the value of(current-output-port)
.
Specifies the maximal line-width for pretty printing, after which line wrap will occur.
(read-file [FILE-OR-PORT])Returns a list containing all toplevel expressions read from the file or port
FILE-OR-PORT
. If no argument is given, input is read from the port that is the current value of(current-input-port)
. After all expressions are read, and if the argument is a port, then the port will not be closed.
(read-line [PORT [LIMIT]]) (write-line STRING [PORT])Line-input and -output.
PORT
defaults to the value of(current-input-port)
and(current-output-port)
, respectively. if the optional argumentLIMIT
is given and not#f
, thenread-line
reads at mostLIMIT
characters per line.
(read-lines [PORT [MAX]])Read
MAX
or fewer lines fromPORT
.PORT
defaults to the value of(current-input-port)
.
(read-string [NUM [PORT]]) (write-string STRING [NUM [PORT]]Read or write
NUM
characters from/toPORT
, which defaults to the value of(current-input-port)
or(current-output-port)
, respectively. IfNUM
is#f
or not given, then all data up to the end-of-file is read, or, in the case ofwrite-string
the whole string is written. If no more input is available,read-string
returns the empty string.
(read-token PREDICATE [PORT])Reads characters from
PORT
(which defaults to the value of(current-input-port)
) and calls the procedurePREDICATE
with each character untilPREDICATE
returns false.
(with-error-output-to-port PORT THUNK)Call procedure
THUNK
with the current error output-port temporarily bound toPORT
.
(with-input-from-port PORT THUNK)Call procedure
THUNK
with the current input-port temporarily bound toPORT
.
(with-output-to-port PORT THUNK)Call procedure
THUNK
with the current output-port temporarily bound toPORT
.
(conc X ...)Returns a string with the string-represenation of all arguments concatenated together.
conc
could be implemented as(define (conc . args) (apply string-append (map ->string args)) )
(string-chop STRING LENGTH)Returns a list of substrings taken by “chopping”
STRING
everyLENGTH
characters:(string-chop "one two three" 4) ==> ("one " "two " "thre" "e")
(string-compare3-ci STRING1 STRING2)Perform a three-way comparison between the
STRING1
andSTRING2
, returning either-1
ifSTRING1
is lexicographically less thanSTRING2
,0
if it is equal, or1
if it s greater.string-compare3-ci
performs a case-insensitive comparison.
(string-intersperse LIST STRING)Returns a string that contains all strings in
LIST
concatenated together.STRING
is placed between each concatenated string.(string-intersperse '("one" "two") "three")is equivalent to
(apply string-append (intersperse '("one" "two") "three"))
(string-split STRING [DELIMITER-STRING [KEEPEMPTY]])Split string into substrings separated by the given delimiters. If no delimiters are specified, a string comprising the tab, newline and space characters is assumed. If the parameter
KEEPEMPTY
is given and not#f
, then empty substrings are retained:(string-split "one two three") ==> ("one" "two" "three") (string-split "foo:bar::baz:" ":" #t) ==> ("foo" "bar" "" "baz" "")
(string-translate STRING FROM [TO])Returns a fresh copy of
STRING
with characters matchingFROM
translated toTO
. IfTO
is omitted, then matching characters are removed.FROM
andTO
may be a character, a string or a list. If bothFROM
andTO
are strings, then the character at the same position inTO
as the matching character inFROM
is substituted.
(string-translate* STRING SMAP)Substitutes elements of
STRING
according toSMAP
.SMAP
should be an association-list where each element of the list is a pair of the form(MATCH \. REPLACEMENT)
. Every occurrence of the stringMATCH
inSTRING
will be replaced by the stringREPLACEMENT
:(string-translate* "<h1>this is a \"string\"</h1>" '(("<" . "<:") (">" . ">") ("\"" . """)) ) ==> "<h1>this is a "string"</ht>"
(substring=? STRING1 STRING2 [START1 [START2 [LENGTH]]]) (substring-ci=? STRING1 STRING2 [START1 [START2 [LENGTH]]])Returns
#t
if the stringsSTRING1
andSTRING2
are equal, or#f
otherwise. The comparison starts at the positionsSTART1
andSTART2
(which default to 0), comparingLENGTH
characters (which defaults to the minimum of the remaining length of both strings).
(substring-index WHICH WHERE [START]) (substring-index-ci WHICH WHERE [START])Searches for first index in string
WHERE
where stringWHICH
occurs. If the optional argumentSTART
is given, then the search starts at that index.substring-index-ci
is a case-insensitive version ofsubstring-index
.
(constantly X ...)Returns a procedure that always returns the values
X ...
regardless of the number and value of its arguments.(constantly X) <=> (lambda args X)
(complement PROC)Returns a procedure that returns the boolean inverse of
PROC
.(complement PROC) <=> (lambda (x) (not (PROC x)))
(compose PROC1 PROC2 ...)Returns a procedure that represents the composition of the argument-procedures
PROC1 PROC2 ...
.(compose F G) <=> (lambda args (call-with-values (lambda () (apply G args)) F))
(conjoin PRED ...)Returns a procedure that returns
#t
if its argument satisfies the predicatesPRED ...
.((conjoin odd? positive?) 33) ==> #t ((conjoin odd? positive?) -33) ==> #f
(disjoin PRED ...)Returns a procedure that returns
#t
if its argument satisfies any predicatePRED ...
.((disjoin odd? positive?) 32) ==> #t ((disjoin odd? positive?) -32) ==> #f
(flip PROC)Returns a two-argument procedure that calls
PROC
with its arguments swapped:(flip PROC) <=> (lambda (x y) (PROC y x))
(list-of PRED)Returns a procedure of one argument that returns
#t
when applied to a list of elements that all satisfy the predicate procedurePRED
, or#f
otherwise.((list-of even?) '(1 2 3)) ==> #f ((list-of number?) '(1 2 3)) ==> #t
(binary-search SEQUENCE PROC)Performs a binary search in
SEQUENCE
, which should be a sorted list or vector.PROC
is called to compare items in the sequence, should accept a single argument and return an exact integer: zero if the searched value is equal to the current item, negative if the searched value is “less” than the current item, and positive otherwise.
List library, see the documentation for SRFI-1
Homogeneous numeric vectors, see the documentation for SRFI-4 In addition to that, the following procedures are also provided:
(u8vector->byte-vector U8VECTOR) (s8vector->byte-vector S8VECTOR) (u16vector->byte-vector U16VECTOR) (s16vector->byte-vector S16VECTOR) (u32vector->byte-vector U32VECTOR) (s32vector->byte-vector S32VECTOR) (f32vector->byte-vector F32VECTOR) (f64vector->byte-vector F64VECTOR)Each of these procedures return the contents of the given vector as a 'packed' byte-vector. The byte order in that vector is platform-dependent (for example little-endian on an Intel processor). The returned byte-vector shares memory with the contents of the vector.
(byte-vector->u8vector BYTE-VECTOR) (byte-vector->s8vector BYTE-VECTOR) (byte-vector->u16vector BYTE-VECTOR) (byte-vector->s16vector BYTE-VECTOR) (byte-vector->u32vector BYTE-VECTOR) (byte-vector->s32vector BYTE-VECTOR) (byte-vector->f32vector BYTE-VECTOR) (byte-vector->f64vector BYTE-VECTOR)Each of these procedures return a vector where the argument
BYTE-VECTOR
is taken as a 'packed' representation of the contents of the vector. The argument-byte-vector shares memory with the contents of the vector.
(subu8vector U8VECTOR FROM TO) (subu16vector U16VECTOR FROM TO) (subu32vector U32VECTOR FROM TO) (subs8vector S8VECTOR FROM TO) (subs16vector S16VECTOR FROM TO) (subs32vector S32VECTOR FROM TO) (subf32vector F32VECTOR FROM TO) (subf64vector F64VECTOR FROM TO)Creates a number vector of the same type as the argument vector with the elements at the positions
FROM
up to but not includingTO
.
String library, see the documentation for SRFI-13
The file srfi-13-syntax.scm
contains macro definitions for
let-string-start+end
.
On systems that support dynamic loading, the srfi-13
unit can
be made available in the interpreter (csi
) by entering
(require-extension srfi-13)
Character set library, see the documentation for SRFI-14
On systems that support dynamic loading, the srfi-14
unit can
be made available in the interpreter (csi
) by entering
(require-extension srfi-14)
Multi-dimensional array, see the documentation for SRFI-25
On systems that support dynamic loading, the srfi-25
unit can
be made available in the interpreter (csi
) by entering
(require-extension srfi-25)
Andrew Wright's pattern matching package. Note that to use the macros in normal compiled code it is not required to declare this unit as used. Only if forms containing these macros are to be expanded at runtime, this is needed.
(match EXP CLAUSE ...) (match-lambda CLAUSE ...) (match-lambda* CLAUSE ...) (match-let ((PAT EXP) ...) BODY) (match-let* ((PAT EXP) ...) BODY) (match-letrec ((PAT EXP) ...) BODY) (match-define PAT EXP)Match expression or procedure arguments with pattern and execute associated expressions. A Postscript manual is available .
(define-structure (ID_0 ID_1 ... ID_N)) (define-structure (ID_0 ID_1 ... ID_N) ((ID_N+1 EXP_1) ... (ID_N+M EXP_M))) (define-const-structure (ID_0 ARG_1 ... ARG_N)) (define-const-structure (ID_0 ARG_1 ... ARG_N) ((ARG_N+1 EXP_1) ... (ARG_N+M EXP_M)))Macros for defining record structures that can be decomposed by
match
.
(match-error-control [MODE])Selects a mode that specifies how
match...
macro forms are to be expanded. With no argument this procedure returns the current mode. A single argument specifies the new mode that decides what should happen if no match-clause applies. The following modes are supported:
#:error
- Signal an error. This is the default.
#:match
- Signal an error and output the offending form.
#:fail
- Omits
pair?
tests when the consequence is to fail incar
orcdr
rather than to signal an error.#:unspecified
- Non-matching expressions will either fail in
car
orcdr
or return an unspecified value. This mode applies to files compiled with theunsafe
option or declaration.When an error is signalled, the raised exception will be of kind
(exn match)
.
Note: match:structure-control
is not available. Structures
defined by the macros provided in this unit are always implemented
as vectors. match:runtime-structures
is also not available.
To use the pattern matching macros with the highlevel (syntax-case
)
macro system (require-extension match)
.
This library unit provides support for regular expressions. The flavor depends on the particular installation platform:
pregexp
library is used.
(grep REGEX LIST)Returns all items of
LIST
that match the regular expressionREGEX
. This procedure could be defined as follows:(define (grep regex lst) (filter (lambda (x) (string-match regex x)) lst) )
(pattern->regexp PATTERN)Converts the file-pattern
PATTERN
into a regular expression.(pattern->regexp "foo.*") ==> "foo\..*"
(regexp? X)Returns
#t
ifX
is a precompiled regular expression, or#f
otherwise.
(string-match REGEXP STRING [START]) (string-match-positions REGEXP STRING [START])Matches the regular expression in
REGEXP
(a string or a precompiled regular expression) withSTRING
and returns either#f
if the match failed, or a list of matching groups, where the first element is the complete match. If the optional argumentSTART
is supplied, it specifies the starting position inSTRING
. For each matching group the result-list contains either:#f
for a non-matching but optional group; a list of start- and end-position of the match inSTRING
(in the case ofstring-match-positions
); or the matching substring (in the case ofstring-match
). Note that the exact string is matched. For searching a pattern inside a string, see below.
(string-search REGEXP STRING [START [RANGE]]) (string-search-positions REGEXP STRING [START [RANGE]])Searches for the first match of the regular expression in
REGEXP
withSTRING
. The search can be limited toRANGE
characters.
(string-split-fields REGEXP STRING [MODE [START]])Splits
STRING
into a list of fields according toMODE
, whereMODE
can be the keyword#:infix
(REGEXP
matches field separator), the keyword#:suffix
(REGEXP
matches field terminator) or#t
(REGEXP
matches field), which is the default.
(string-substitute REGEXP SUBST STRING [INDEX])Searches substrings in
STRING
that matchREGEXP
and substitutes them with the stringSUBST
. The substitution can contain references to subexpressions inREGEXP
with the\NUM
notation, whereNUM
refers to the NUMth parenthesized expression. The optional argumentINDEX
defaults to 1 and specifies the number of the match to be substituted. Any non-numeric index specifies that all matches are to be substituted.(string-substitute "([0-9]+) (eggs|chicks)" "2 (1)" "99 eggs or 99 chicks" 2) ==> "99 eggs or chicks (99)"
(string-substitute* STRING SMAP)Substitutes elements of
STRING
according toSMAP
.SMAP
should be an association-list where each element of the list is a pair of the form(MATCH . REPLACEMENT)
. Every occurrence of the regular expressionMATCH
inSTRING
will be replaced by the stringREPLACEMENT
(string-substitute* "<h1>Hello, world!</h1>" '(("<[/A-Za-z0-9]+>" . "")))) ==> "Hello, world!"
Hieb's and Dybvig's hygienic macro package. Provides syntax-case
and syntax-rules
. A postscript manual can be found here:
Technical Report #356
Notes:
(define-syntax (keyword var) ...)is allowed for
define-syntax
.
import
or import-only
is used with an argument that names a module that is currently not defined, then
the current include-path
(and the repository-path
as well) is searched for a source-file
of the same name (possibly with the extension .scm
), which (if found)
will be “visited” (it's module- and syntax-definitions are processed) using the
procedure visit
. Note that exported identifiers must be defined
via define
or define-syntax
. Other defining forms (like define-values
)
are not recognized as exporting definitions.
There are currently no built-in modules.
-hygienic
option to the compiler or interpreter. The syntax-case
unit has
only to be declared as used if compiled code invokes macroexpand
or eval
with high-level macro syntax forms.
define-syntax
can not be used inside an eval-when
form.
Here is a small example that demonstrates separate compilation:
Let's say we have one file foo.scm
that defines a module:
(module foo (pr (bar baz)) (define pr print) (define baz 99) (define-syntax bar (syntax-rules () [(_ x) (list baz 'x)] ) ) )
and another that uses it (use-foo.scm
):
(load "foo.so") ; (require 'foo) would also work (import foo) (pr (bar hello))
Compiling the files like this will lead to one dynamically loadable library and a plain executable:
$ csc -s -hygienic foo.scm $ csc -hygienic use-foo.scm $ use-foo $ (99 hello)
The export
declaration can be used to export identifiers exported from modules
defined in a given source file. These exports will then be visible as normal toplevel
variables in external code that loads or links with this file. The rationale behind
this is to make it possible to create libraries and extensions that use modules
internally, but still can be used in client code that doesn't use modules.
(visit FILENAME)Reads all toplevel expressions from the given file and expands all syntax, extracting module- and syntax-information to be subsequently used during the current compilation or interpretation of modules.
A simple multithreading package. This threading package follows largely the specification of SRFI-18. For more information see the documentation for SRFI-18
Notes:
enable-warnings
, then a warning
message is written to the port that is the value of (current-error-port)
.
tcp
unit).
dynamic-wind
is involved.
make-parameter
)
dynamic-wind
thunks.
The following procedures are provided, in addition to the procedures defined in SRFI-18:
(thread-deliver-signal! THREAD X)This will cause
THREAD
to signal the conditionX
once it is scheduled for execution. After signalling the condition, the thread continues with its normal execution.
(thread-quantum THREAD)Returns the quantum of
THREAD
, which is an exact integer specifying the approximate time-slice of the thread.
(thread-quantum-set! THREAD QUANTUM)Sets the quantum of
THREAD
toQUANTUM
.
(format DESTINATION FORMAT-STRING . ARGUMENTS)An almost complete implementation of Common LISP format description according to the CL reference book Common LISP from Guy L. Steele, Digital Press. This code was originally part of SLIB. The author is Dirk Lutzebaeck.
Returns
#t
,#f
or a string; has side effect of printing according toFORMAT-STRING
. IfDESTINATION
is#t
, the output is to the current output port and#t
is returned. IfDESTINATION
is#f
, a formatted string is returned as the result of the call. IfDESTINATION
is a string,DESTINATION
is regarded as the format string;FORMAT-STRING
is then the first argument and the output is returned as a string. IfDESTINATION
is a number, the output is to the value of(current-error-port)
. OtherwiseDESTINATION
must be an output port and#t
is returned.
FORMAT-STRING
must be a string. In case of a formatting error format returns#f
and prints a message on the value of(current-error-port)
. Characters are output as if the string were output by thedisplay
function with the exception of those prefixed by a tilde (~). For a detailed description of theFORMAT-STRING
syntax please consult a Common LISP format reference manual. A list of all supported, non-supported and extended directives can be found informat.txt
.This unit uses definitions from the
extras
unit.
format
implements SRFI-28
This unit provides services as used on many UNIX-like systems. Note that the following definitions are not available on non-UNIX systems like Windows or DOS.
This unit uses the regex
and extras
units.
All errors related to failing file-operations will signal a condition
of kind (exn i/o file)
.
(change-directory NAME)Changes the current working directory to
NAME
.
(current-directory)Returns the name of the current working directory.
(delete-directory NAME)Deletes the directory with the pathname
NAME
. The directory has to be empty.
(directory PATHNAME)Returns a list with all files that are contained in the directory with the name
PATHNAME
.
(directory? NAME)Returns
#t
if there exists a file with the nameNAME
and if that file is a directory, or#f
otherwise.
(glob PATTERN1 ...)Returns a list of the pathnames of all existing files matching
PATTERN1 ...
, which should be strings containing the usual file-patterns (with*
matching zero or more characters and?
matching zero or one character).
(call-with-input-pipe CMDLINE PROC [MODE]) (call-with-output-pipe CMDLINE PROC [MODE])Call
PROC
with a single argument: a input- or output port for a pipe connected to the subprocess named inCMDLINE
. IfPROC
returns normally, the pipe is closed and any result values are returned.
(close-input-pipe PORT) (close-output-pipe PORT)Closes the pipe given in
PORT
and waits until the connected subprocess finishes.
(create-pipe)The fundamental pipe-creation operator. Calls the C function
pipe()
and returns 2 values: the file-descriptors of the input- and output-ends of the pipe.
(open-input-pipe CMDLINE [MODE])Spawns a subprocess with the command-line string
CMDLINE
and returns a port, from which the output of the process can be read. IfMODE
is specified, it should be the keyword#:text
(the default) or#:binary
.
(open-output-pipe CMDLINE [MODE])Spawns a subprocess with the command-line string
CMDLINE
and returns a port. Anything written to that port is treated as the input for the process. IfMODE
is specified, it should be the keyword#:text
(the default) or#:binary
.
This variable contains the maximal number of bytes that can be written atomically into a pipe or FIFO.
(with-input-from-pipe CMDLINE THUNK [MODE]) (with-output-to-pipe CMDLINE THUNK [MODE])Temporarily set the value of
current-input-port/current-output-port
to a port for a pipe connected to the subprocess named inCMDLINE
and call the procedureTHUNK
with no arguments. AfterTHUNK
returns normally the pipe is closed and the standard input-/output port is restored to its previous value and any result values are returned.(with-output-to-pipe "gs -dNOPAUSE -sDEVICE=jpeg -dBATCH -sOutputFile=signballs.jpg -g600x600 -q -" (lambda () (print #<<EOF %!IOPSC-1993 %%Creator: HAYAKAWA Takashi<xxxxxxxx@xx.xxxxxx.xx.xx> /C/neg/d/mul/R/rlineto/E/exp/H{{cvx def}repeat}def/T/dup/g/gt/r/roll/J/ifelse 8 H/A/copy(z&v4QX&93r9AxYQOZomQalxS2w!!O&vMYa43d6r93rMYvx2dca!D&cjSnjSnjjS3o!v&6A X&55SAxM1CD7AjYxTTd62rmxCnTdSST0g&12wECST!&!J0g&D1!&xM0!J0g!l&544dC2Ac96ra!m&3A F&&vGoGSnCT0g&wDmlvGoS8wpn6wpS2wTCpS1Sd7ov7Uk7o4Qkdw!&Mvlx1S7oZES3w!J!J!Q&7185d Z&lx1CS9d9nE4!k&X&MY7!&1!J!x&jdnjdS3odS!N&mmx1C2wEc!G&150Nx4!n&2o!j&43r!U&0777d ]&2AY2A776ddT4oS3oSnMVC00VV0RRR45E42063rNz&v7UX&UOzF!F!J![&44ETCnVn!a&1CDN!Y&0M V1c&j2AYdjmMdjjd!o&1r!M){( )T 0 4 3 r put T(/)g{T(9)g{cvn}{cvi}J}{($)g[]J}J cvx}forall/moveto/p/floor/w/div/S/add 29 H[{[{]setgray fill}for Y}for showpage EOF ) ) )
(create-fifo FILENAME [MODE])Creates a FIFO with the name
FILENAME
and the permission bitsMODE
, which defaults to(+ perm/irwxu perm/irwxg perm/irwxo)
(duplicate-fileno OLD [NEW])If
NEW
is given, then the file-descriptorNEW
is opened to access the file with the file-descriptorOLD
. Otherwise a fresh file-descriptor accessing the same file asOLD
is returned.
(file-close FILENO)Closes the input/output file with the file-descriptor
FILENO
.
(file-open FILENAME FLAGS [MODE])Opens the file specified with the string
FILENAME
and open-flagsFLAGS
using the C functionopen()
. On success a file-descriptor for the opened file is returned.FLAGS
should be a bitmask containing one or more of theopen/...
values ored together usingbitwise-ior
(or simply added together). The optionalMODE
should be a bitmask composed of one or more permission values likeperm/irusr
and is only relevant when a new file is created. The default mode isperm/irwxu | perm/irgrp | perm/iroth
.
(file-mkstemp TEMPLATE-FILENAME)Create a file based on the given
TEMPLATE-FILENAME
, in which the six last characters must be “XXXXXX”. These will be replaced with a string that makes the filename unique. The file descriptor of the created file and the generated filename is returned. See themkstemp(3)
manual page for details on how this function works. The template string given is not modified.Example usage:
(let-values (((fd temp-path) (file-mkstemp "/tmp/mytemporary.XXXXXX"))) (let ((temp-port (open-output-file* fd))) (format temp-port "This file is ~A.~%" temp-path) (close-output-port temp-port)))
(file-read FILENO SIZE [BUFFER])Reads
SIZE
bytes from the file with the file-descriptorFILENO
. If a string or bytevector is passed in the optional argumentBUFFER
, then this string will be destructively modified to contain the read data. This procedure returns a list with two values: the buffer containing the data and the number of bytes read.
(file-select READFDLIST WRITEFDLIST [TIMEOUT])Waits until any of the file-descriptors given in the lists
READFDLIST
andWRITEFDLIST
is ready for input or output, respectively. If the optional argumentTIMEOUT
is given and not false, then it should specify the number of seconds after which the wait is to be aborted. This procedure returns two values: the lists of file-descriptors ready for input and output, respectively.READFDLIST
and WRITEFDLIST may also by file-descriptors instead of lists. In this case the returned values are booleans indicating whether input/output is ready by#t
or#f
otherwise. You can also pass#f
asREADFDLIST
orWRITEFDLIST
argument, which is equivalent to()
.
(file-write FILENO BUFFER [SIZE])Writes the contents of the string or bytevector
BUFFER
into the file with the file-descriptorFILENO
. If the optional argumentSIZE
is given, then only the specified number of bytes are written.
These variables contain file-descriptors for the standard I/O files.
Flags for use with
file-open
.
(open-input-file* FILENO [OPENMODE]) (open-output-file* FILENO [OPENMODE])Opens file for the file-descriptor
FILENO
for input or output and returns a port.FILENO
should be a positive exact integer.OPENMODE
specifies an additional mode for opening the file (currently only the keyword#:append
is supported, which opens an output-file for appending).
(port->fileno PORT)If
PORT
is a file-port, then a file-descriptor is returned for this port. Otherwise an error is signaled.
(file-modification-time FILE)Returns time (in seconds) of the last modification of
FILE
.FILE
may be a filename or a file-descriptor. If the file does not exist, an error is signaled.
(file-position FILE)Returns the current file position of
FILE
, which should be a port or a file-descriptor.
(file-size FILENAME)Returns the size of the file designated by
FILE
.FILE
may be a filename or a file-descriptor. If the file does not exist, an error is signaled.
(file-truncate FILE OFFSET)Truncates the file
FILE
to the lengthOFFSET
, which should be an integer. If the file-size is smaller or equal toOFFSET
then nothing is done.FILE
should be a filename or a file-descriptor.
(set-file-position! FILE POSITION [WHENCE])Sets the current read/write position of
FILE
toPOSITION
, which should be an exact integer.FILE
should be a port or a file-descriptor.WHENCE
specifies how the position is to interpreted and should be one of the valuesseek/set, seek/cur
andseek/end
. It defaults toseek/set
.Exceptions:
(exn bounds)
,(exn i/o file)
(parent-process-id)Returns the process ID of the parent of the current process.
(process-execute PATHNAME [LIST])Creates a new child process and replaces the running process with it using the UNIX system call
execv()
. If the optional argumentLIST
is given, then it should contain a list of strings which are passed as arguments to the subprocess.
(process-fork [THUNK])Creates a new child process with the UNIX system call
fork()
. Returns either the PID of the child process or 0. IfTHUNK
is given, then the child process calls it as a procedure with no arguments and terminates.
(process-run PATHNAME [LIST])Creates a new child process using the UNIX system call
fork()
that executes the program given by the stringPATHNAME
using the UNIX system callexecv()
. The PID of the new process is returned. IfLIST
is not specified, thenPATHNAME
is passed to a program named by the environment variableSHELL
(or/bin/sh
, if the variable is not defined), so usual argument expansion can take place.
(process-signal PID [SIGNAL])Sends
SIGNAL
to the process with the idPID
using the UNIX system callkill()
.SIGNAL
defaults to the value of the variablesignal/term
.
(process-wait [PID [NOHANG]])Suspends the current process until the child process with the id
PID
has terminated using the UNIX system callwaitpid()
. IfPID
is not given, then this procedure waits for any child process. IfNOHANG
is given and not#f
then the current process is not suspended. This procedure returns three values:
PID
or 0, if NOHANG
is true and the child process
has not terminated yet;
#t
if the process exited normally or #f
otherwise;
(process COMMANDLINE)Passes the string
COMMANDLINE
to the host-system's shell that is invoked as a subprocess and returns three values: an input port from which data written by the sub-process can be read, an output port from which any data written to will be received as input in the sub-process and the process-id of the started sub-process. All I/O from/to ports returned byprocess
is fully nonblocking.
(sleep SECONDS)Puts the process to sleep for
SECONDS
. Returns either 0 if the time has completely elapsed, or the number of remaining seconds, if a signal occurred.
(create-symbolic-link OLDNAME NEWNAME)Creates a symbolic link with the filename
NEWNAME
that points to the file namedOLDNAME
.
(read-symbolic-link FILENAME)Returns the filename to which the symbolic link
FILENAME
points.
(file-owner FILE)Returns the user-id of
FILE
.FILE
may be a filename or a file-descriptor.
(file-permissions FILE)Returns the permission bits for
FILE
. You can test this value by performing bitwise operations on the result and theperm/...
values.FILE
may be a filename or a file-descriptor.
(file-read-access? FILENAME) (file-write-access? FILENAME) (file-execute-access? FILENAME)These procedures return
#t
if the current user has read, write or execute permissions on the file namedFILENAME
.
(change-file-mode FILENAME MODE)Changes the current file mode of the file named
FILENAME
toMODE
using thechmod()
system call. Theperm/...
variables contain the various permission bits and can be combinded with thebitwise-ior
procedure.
(change-file-owner FILENAME UID GID)Changes the owner information of the file named
FILENAME
to the user- and group-idsUID
andGID
(which should be exact integers) using thechown()
system call.
(current-user-id) (current-group-id) (current-effective-user-id) (current-effective-group-id)Return the user- and group-ids of the current process.
(group-information GROUP)If
GROUP
specifies a valid group-name or group-id, then this procedure returns four values: the group-name, the encrypted group password, the group ID and a list of the names of all group members. If no group with the given name or ID exists, then#f
is returned.
(get-groups)Returns a list with the supplementary group IDs of the current user.
(set-groups! GIDLIST)Sets the supplementrary group IDs of the current user to the IDs given in the list
GIDLIST
.Only the superuser may invoke this procedure.
(initialize-groups USERNAME BASEGID)Sets the supplementrary group IDs of the current user to the IDs from the user with name
USERNAME
(a string), includingBASEGID
.Only the superuser may invoke this procedure.
These variables contain permission bits as used in
change-file-mode
.
(set-user-id! UID)Sets the effective user id of the current process to
UID
, which should be a positive integer.
(user-information USER)If
USER
specifes a valid username (as a string) or user ID, then the user database is consulted and a list of 7 values are returned: the user-name, the encrypted password, the user ID, the group ID, a user-specific string, the home directory and the default shell. If no user with this name or ID can be found, then#f
is returned.
(file-lock PORT [START [LEN]])Locks the file associated with
PORT
for reading or writing (according to whetherPORT
is an input- or output-port).START
specifies the starting position in the file to be locked and defaults to 0.LEN
specifies the length of the portion to be locked and defaults to#t
, which means the complete file.file-lock
returns a “lock”-object.
(file-lock/blocking PORT [START [LEN]])Similar to
file-lock
, but if a lock is held on the file, the current process blocks (including all threads) until the lock is released.
(file-test-lock PORT [START [LEN]])Tests whether the file associated with
PORT
is locked for reading or writing (according to whetherPORT
is an input- or output-port) and returns either#f
or the process-id of the locking process.
(file-unlock LOCK)Unlocks the previously locked portion of a file given in
LOCK
.
(set-alarm! SECONDS)Sets an internal timer to raise the
signal/alrm
afterSECONDS
are elapsed. You can use theset-signal-handler!
procedure to write a handler for this signal.
(set-signal-handler! SIGNUM PROC)Establishes the procedure of one argument
PROC
as the handler for the signal with the codeSIGNAL
.PROC
is called with the signal number as its sole argument. If the argumentPROC
is#f
then this signal will be ignored.
(set-signal-mask! SIGLIST)Sets the signal mask of the current process to block all signals given in the list
SIGLIST
. Signals masked in that way will not be delivered to the current process.
These variables contain signal codes for use with
process-signal
orset-signal-handler!
.
(current-environment)Returns a association list of the environment variables and their current values.
Note: Under Mac OS X, this procedure always returns the empty list.
(setenv VARIABLE VALUE)Sets the environment variable named
VARIABLE
toVALUE
. Both arguments should be strings. If the variable is not defined in the environment, a new definition is created.
(unsetenv VARIABLE)Removes the definition of the environment variable
VARIABLE
from the environment of the current process. If the variable is not defined, nothing happens.
(map-file-to-memory ADDRESS LEN PROTECTION FLAG FILENO [OFFSET])Maps a section of a file to memory using the C function
mmap()
.ADDRESS
should be a foreign pointer object or#f
;LEN
specifies the size of the section to be mapped;PROTECTION
should be one or more of the flagsprot/read, prot/write, prot/exec
orprot/none
bitwise-iored together;FLAG
should be one or more of the flagsmap/fixed, map/shared, map/private, map/anonymous
ormap/file
;FILENO
should be the file-descriptor of the mapped file. The optional argumentOFFSET
gives the offset of the section of the file to be mapped and defaults to 0. This procedure returns an object representing the mapped file section. The proceduremove-memory!
can be used to access the mapped memory.
(memory-mapped-file-pointer MMAP)Returns a machine pointer to the start of the memory region to which the file is mapped.
(unmap-file-from-memory MMAP [LEN])Unmaps the section of a file mapped to memory using the C function
munmap()
.MMAP
should be a mapped file as returned by the proceduremap-file-to-memory
. The optional argumentLEN
specifies the length of the section to be unmapped and defaults to the complete length given when the file was mapped.
(seconds->local-time SECONDS)Breaks down the time value represented in
SECONDS
into a 10 element vector of the form#(seconds minutes hours mday month year wday yday dstflag timezone)
, in the following format:
- seconds: the number of seconds after the minute (0 - 59)
- minutes: the number of minutes after the hour (0 - 59)
- hours: the number of hours past midnight (0 - 23)
- mday: the day of the month (1 - 31)
- month: the number of months since january (0 - 11)
- year: the number of years since 1900
- wday: the number of days since Sunday (0 - 6)
- yday: the number of days since January 1 (0 - 365)
- dstflag: a flag that is true if Daylight Saving Time is in effect at the time described.
- timezone: the difference between UTC and the latest local standard time, in seconds west of UTC.
(seconds->string SECONDS)Converts the local time represented in
SECONDS
into a string of the form"Tue May 21 13:46:22 1991\n"
.
(seconds->utc-time SECONDS)Similar to
seconds->local-time
, but interpretesSECONDS
as UTC time.
(time->string VECTOR)Converts the broken down time represented in the 10 element vector
VECTOR
into a string of the form"Tue May 21 13:46:22 1991\n"
.
(_exit [CODE])Exits the current process without flushing any buffered output (using the C function
_exit
). Note that theexit-handler
is not called when this procedure is invoked. The optional return-codeCODE
defaults to0
.
These variables contain error codes as returned by
errno
.
(find-files DIRECTORY PREDICATE [ACTION [IDENTITY [LIMIT]]])Recursively traverses the contents of
DIRECTORY
(which should be a string) and invokes the procedureACTION
for all files for which the procedurePREDICATE
is true.PREDICATE
may me a procedure of one argument or a regular-expression string.ACTION
should be a procedure of two arguments: the currently encountered file and the result of the previous invocation ofACTION
, or, if this is the first invocation, the value ofIDENTITY
.ACTION
defaults tocons
,IDENTITY
defaults to()
.LIMIT
should a procedure of one argument that is called for each nested directory and which should return true, if that directory is to be traversed recursively.LIMIT
may also be an exact integer that gives the maximum recursion depth. A depth of0
means the files in the specified directory are traversed but not any nested directories.LIMIT
may also be#f
(the default), which is equivalent to(constantly #t)
.Note that
ACTION
is called with the full pathname of each file, including the directory prefix.
(get-host-name)Returns the hostname of the machine that this process is running on.
(system-information)Invokes the UNIX system call
uname()
and returns 5 values: system-name, node-name, OS release, OS version and machine.
(set-buffering-mode! PORT MODE [BUFSIZE])Sets the buffering-mode for the file associated with
PORT
toMODE
, which should be one of the keywords#:full, #:line
or#:none
. IfBUFSIZE
is specified it determines the size of the buffer to be used (if any).
(terminal-name PORT)Returns the name of the terminal that is connected to
PORT
.
(terminal-port? PORT)Returns
#t
ifPORT
is connected to a terminal and#f
otherwise.
change-directory
change-file-mode
change-file-owner
create-directory
create-fifo
create-pipe
create-symbolic-link
current-directory
current-effective-groupd-id
current-effective-user-id
current-group-id
current-parent-id
current-process-id
current-user-id
delete-directory
duplicate-fileno
_exit
file-close
file-execute-access?
file-open
file-lock
file-position
file-read
file-read-access?
file-select
file-test-lock
file-truncate
file-unlock
file-write
file-write-access?
get-groups
get-host-name
initialize-groups
map-file-to-memory
open-input-file*
open-output-file*
open-input-pipe
open-output-pipe
port->fileno
process-execute
process-fork
process-signal
process-wait
close-input-pipe
close-output-pipe
read-symbolic-link
seconds->local-time
seconds->string
seconds->utc-time
set-alarm!
set-buffering-mode!
set-file-position!
set-groups!
set-signal-mask!
set-user-id!
setenv
sleep
system-information
terminal-name
terminal-port?
time->string
unsetenv
unmap-file-from-memory
user-information
This unit contains some utility procedures for Shell scripting and for some file operations.
This unit uses the extras
and regex
units.
(absolute-pathname? PATHNAME)Returns
#t
if the stringPATHNAME
names an absolute pathname, and returns#f
otherwise.
(decompose-pathname PATHNAME)Returns three values: the directory-, filename- and extension-components of the file named by the string
PATHNAME
. For any component that is not contained inPATHNAME
,#f
is returned.
(make-pathname DIRECTORY FILENAME [EXTENSION]) (make-absolute-pathname DIRECTORY FILENAME [EXTENSION])Returns a string that names the file with the components
DIRECTORY, FILENAME
and (optionally)EXTENSION
.DIRECTORY
can be#f
(meaning no directory component), a string or a list of strings.FILENAME
andEXTENSION
should be strings or#f
.make-absolute-pathname
returns always an absolute pathname.
(pathname-extension PATHNAME)Accessors for the components of
PATHNAME
. If the pathname does not contain the accessed component, then#f
is returned.
(pathname-replace-extension PATHNAME EXTENSION)Return a new pathname with the specified component of
PATHNAME
replaced by a new value.
(pathname-strip-extension PATHNAME)Return a new pathname with the specified component of
PATHNAME
stripped.
(create-temporary-file [EXTENSION])Creates an empty temporary file and returns its pathname. If
EXTENSION
is not given, then.tmp
is used. If the environment variableTMPDIR, TEMP
orTMP
is set, then the pathname names a file in that directory.
(delete-file* FILENAME)If the file
FILENAME
exists, it is deleted and#t
is returned. If the file does not exist, nothing happens and#f
is returned.
(for-each-line PROCEDURE [PORT])Calls
PROCEDURE
for each line read fromPORT
(which defaults to the value of(current-input-port)
. The argument passed toPORCEDURE
is a string with the contents of the line, excluding any line-terminators. When all input has been read from the port,for-each-line
returns some unspecified value.
(for-each-argv-line PROCEDURE)Opens each file listed on the command line in order, passing one line at a time into
PROCEDURE
. The filename-
is interpreted as(current-input-port)
. If no arguments are given on the command line it again uses the value of(current-input-port)
.This code will act as a simple Unix cat(1) command:
(for-each-argv-line print)
(system* FORMATSTRING ARGUMENT1 ...)Similar to
(system (sprintf FORMATSTRING ARGUMENT1 ...))
, but signals an error if the invoked program should return a nonzero exit status.
(read-all [FILE-OR-PORT])If
FILE-OR-PORT
is a string, then this procedure returns the contents of the file as a string. IfFILE-OR-PORT
is a port, all remaining input is read and returned as a string. The port is not closed. If no argument is provided, input will be read from the port that is the current value of(current-input-port)
.
This unit provides basic facilities for communicating over TCP sockets. The socket interface should be mostly compatible to the one found in PLT Scheme.
This unit uses the extras
unit.
All errors related to failing network operations will raise a condition
of kind (exn i/o network)
.
(tcp-listen TCPPORT [BACKLOG [HOST]])Creates and returns a TCP listener object that listens for connections on
TCPPORT
, which should be an exact integer.BACKLOG
specifies the number of maximally pending connections (and defaults to 4). If the optional argumentHOST
is given and not#f
, then only incoming connections for the given host (or IP) are accepted.
(tcp-listener? X)Returns
#t
ifX
is a TCP listener object, or#f
otherwise.
(tcp-accept LISTENER)Waits until a connection is established on the port on which
LISTENER
is listening and returns two values: an input- and output-port that can be used to communicate with the remote process.Note: this operation and any I/O on the ports returned will not block other running threads.
(tcp-accept-ready? LISTENER)Returns
#t
if there are any connections pending onLISTENER
, or#f
otherwise.
(tcp-listener-port LISTENER)Returns the port number assigned to
LISTENER
(If you pass0
totcp-listen
, then the system will choose a port-number for you).
(tcp-connect HOSTNAME [TCPPORT])Establishes a client-side TCP connection to the machine with the name
HOSTNAME
(a string) atTCPPORT
(an exact integer) and returns two values: an input- and output-port for communicating with the remote process.Note: any I/O on the ports returned will not block other running threads.
(tcp-addresses PORT)Returns two values for the input- or output-port
PORT
(which should be a port returned by eithertcp-accept
ortcp-connect
): the IP address of the local and the remote machine that are connected over the socket associated withPORT
. The returned addresses are strings inXXX.XXX.XXX.XXX
notation.
(tcp-abandon-port PORT)Marks the socket port
PORT
as abandoned. This is mainly useful to close down a port without breaking the connection.
A very simple example follows. Say we have the two files client.scm
and server.scm
:
; client.scm (define-values (i o) (tcp-connect "localhost" 4242)) (write-line "Good Bye!" o) (print (read-line i))
; server.scm (define l (tcp-listen 4242)) (define-values (i o) (tcp-accept l)) (write-line "Hello!" o) (print (read-line i)) (close-input-port i) (close-output-port o) % csi -script server.scm & [1] 1409 % csi -script client.scm Good Bye! Hello!
Copyright (c) 2002 Anthony Carrico
A simple and flexible command-line option parsing facility. Options may
be either short one-character options of the form -X[ARGUMENT]
or long multicharacter ones of the form --XXX[=ARGUMENT]
. Short
options may be coalesced. An argument of the form --
stops
option processing.
For more information take a look at the SRFI-37 documentation.
An example:
#!/usr/local/bin/csi -script ;;;; secho - display command-line arguments (define nl 1) (define help (option '(#\h "help") #f #f (lambda _ (print "Usage: secho [OPTION] ARG ... -h --help show this text -n --newline N add N newline characters (default: 1)") (exit) ) ) ) (define newlines (option '(#\n "newline") #t #f (lambda (o n x vals) (set! nl (string->number x)) vals) ) ) (for-each (lambda (x) (print* x #\space)) (reverse (args-fold (command-line-arguments) (list help newlines) (lambda (o n x vals) (error "unrecognized option" n) ) cons '() ) ) ) (display (make-string nl #\newline))
This unit provides a number of handy low-level operations. Use at your own risk.
This unit uses the srfi-4
and extras
units.
(address->pointer ADDRESS)Creates a new foreign pointer object initialized to point to the address given in the integer
ADDRESS
.
(allocate BYTES)Returns a pointer to a freshly allocated region of static memory. This procedure could be defined as follows:
(define allocate (foreign-lambda c-pointer "malloc" integer))
(free POINTER)Frees the memory pointed to by
POINTER
. This procedure could be defined as follows:(define free (foreign-lambda c-pointer "free" integer))
(null-pointer? PTR)Returns
#t
ifPTR
contains aNULL
pointer, or#f
otherwise.
(object->pointer X)Returns a pointer pointing to the Scheme object X, which should be a non-immediate object. Note that data in the garbage collected heap moves during garbage collection.
(pointer->address PTR)Returns the address, to which the pointer
PTR
points.
(pointer->object PTR)Returns the Scheme object pointed to by the pointer
PTR
.
(pointer-offset PTR N)Returns a new pointer representing the pointer
PTR
increased byN
.
(pointer-u8-ref PTR)Returns the unsigned byte at the address designated by
PTR
.
(pointer-s8-ref PTR)Returns the signed byte at the address designated by
PTR
.
(pointer-u16-ref PTR)Returns the unsigned 16-bit integer at the address designated by
PTR
.
(pointer-s16-ref PTR)Returns the signed 16-bit integer at the address designated by
PTR
.
(pointer-u32-ref PTR)Returns the unsigned 32-bit integer at the address designated by
PTR
.
(pointer-s32-ref PTR)Returns the signed 32-bit integer at the address designated by
PTR
.
(pointer-f32-ref PTR)Returns the 32-bit float at the address designated by
PTR
.
(pointer-f64-ref PTR)Returns the 64-bit double at the address designated by
PTR
.
(pointer-u8-set! PTR N)Stores the unsigned byte
N
at the address designated byPTR
.
(pointer-s8-set! PTR N)Stores the signed byte
N
at the address designated byPTR
.
(pointer-u16-set! PTR N)Stores the unsigned 16-bit integer
N
at the address designated byPTR
.
(pointer-s16-set! PTR N)Stores the signed 16-bit integer
N
at the address designated byPTR
.
(pointer-u32-set! PTR N)Stores the unsigned 32-bit integer
N
at the address designated byPTR
.
(pointer-s32-set! PTR N)Stores the 32-bit integer
N
at the address designated byPTR
.
(pointer-f32-set! PTR N)Stores the 32-bit floating-point number
N
at the address designated byPTR
.
(pointer-f64-set! PTR N)Stores the 64-bit floating-point number
N
at the address designated byPTR
.
(align-to-word PTR-OR-INT)Accepts either a machine pointer or an integer as argument and returns a new pointer or integer aligned to the native word size of the host platform.
“Tagged” pointers are foreign pointer objects with an extra tag object.
(tag-pointer PTR TAG)Creates a new tagged pointer object from the foreign pointer
PTR
with the tagTAG
, which may an arbitrary Scheme object.
(tagged-pointer? X TAG)Returns
#t
, ifX
is a tagged pointer object with the tagTAG
(using aneq?
comparison), or#f
otherwise.
(pointer-tag PTR)If
PTR
is a tagged pointer object, its tag is returned. IfPTR
is a normal, untagged foreign pointer object#f
is returned. Otherwise an error is signalled.
(extend-procedure PROCEDURE X)Returns a copy of the procedure
PROCEDURE
which contains an additional data slot initialized toX
. IfPROCEDURE
is already an extended procedure, then its data slot is changed to containX
and the same procedure is returned.
(extended-procedure? PROCEDURE)Returns
#t
ifPROCEDURE
is an extended procedure, or#f
otherwise.
(procedure-data PROCEDURE)Returns the data object contained in the extended procedure
PROCEDURE
.
(set-procedure-data! PROCEDURE X)Changes the data object contained in the extended procedure
PROCEDURE
toX
.(define foo (letrec ((f (lambda () (procedure-data x))) (x #f) ) (set! x (extend-procedure f 123)) x) ) (foo) ==> 123 (set-procedure-data! foo 'hello) (foo) ==> hello
(byte-vector FIXNUM ...)Returns a freshly allocated byte-vector with
FIXNUM ...
as its initial contents.
(byte-vector? X)Returns
#t
ifX
is a byte-vector object, or#f
otherwise.
(byte-vector-fill! BYTE-VECTOR N)Sets each element of
BYTE-VECTOR
toN
, which should be an exact integer.
(byte-vector->list BYTE-VECTOR)Returns a list with elements taken from
BYTE-VECTOR
.
(byte-vector->string BYTE-VECTOR)Returns a string with the contents of
BYTE-VECTOR
.
(byte-vector-length BYTE-VECTOR)Returns the number of elements in
BYTE-VECTOR
.
(byte-vector-ref BYTE-VECTOR INDEX)Returns the byte at the
INDEX
th position ofBYTE-VECTOR
.
(byte-vector-set! BYTE-VECTOR INDEX N)Sets the byte at the
INDEX
th position ofBYTE-VECTOR
to the value of the exact integern
.
(executable-byte-vector->procedure PBYTE-VECTOR)Returns a procedure that on invocation will execute the code in
PBYTE-VECTOR
, which should have been allocated usingmake-executable-byte-vector
. The procedure follows the native C calling convention, and will be called as if declared with the following prototype:void <procedure>(int argc, C_word closure, C_word k, C_word arg1, ...)
argc
contains the number of argumentsarg1, ...
that are passed plus 2 (includingclosure
andk
).closure
is the procedure object itself.k
is a continuation closure that should be called when the code is about to return.typedef void (*CONTINUATION)(int argc, C_word closure, C_word result); ((CONTINUATION)k[ 1 ])(2, k, result)(
k
is a data object with the second word being the actual code pointer)An example:
(define x (make-executable-byte-vector 17)) (move-memory! '#u8(#x8b #x44 #x24 #x0c ; movl 12(%esp), %eax - `k' #x8b #x5c #x24 #x10 ; movl 16(%esp), %ebx - `arg1' #x53 ; pushl %ebx - push result #x50 ; pushl %eax - push k #x6a #x02 ; pushl $2 - push argument count #x8b #x40 #x04 ; movl 4(%eax), %eax - fetch code pointer #xff #xd0) ; call *%eax x) (define y (executable-byte-vector->procedure x)) (y 123) ==> 123The result of calling
executable-byte-vector->procedure
with a non-executable statically allocated byte-vector is undefined.
(invoke-executable-byte-vector PBYTE-VECTOR ARG1 ...)Invokes the machine code stored in the executable byte-vector
PBYTE-VECTOR
. The native C calling conventions are used, but the invoked code is passed a single argument containing a pointer to an array of the Scheme objectsARG1 ...
.(define v (make-executable-byte-vector 7)) (move-memory! '#u8(#x8b #x44 #x24 #x04 ; movl 4(%esp), %eax #x8b #x00 ; movl 0(%eax), %eax #xc3) ; ret v) (invoke-executable-byte-vector v "hello!") ==> "hello!"
(list->byte-vector LIST)Returns a byte-vector with elements taken from
LIST
, where the elements ofLIST
should be exact integers.
(make-byte-vector SIZE [INIT])Creates a new byte-vector of size
SIZE
. IfINIT
is given, then it should be an exact integer with which every element of the byte-vector is initialized.
(make-executable-byte-vector SIZE [INIT])As
make-static-byte-vector
, but the code is suitable for execution. Note: this feature is currently only available on x86 platforms.Exceptions:
(exn bounds)
,(exn runtime)
(make-static-byte-vector SIZE [INIT])As
make-byte-vector
, but allocates the byte-vector in storage that is not subject to garbage collection. To free the allocated memory, one has to callobject-release
explicitly.Exceptions:
(exn bounds)
,(exn runtime)
(static-byte-vector->pointer PBYTE-VECTOR)Returns a pointer object pointing to the data in the statically allocated byte-vector
PBYTE-VECTOR
.
(string->byte-vector STRING)Returns a byte-vector with the contents of
STRING
.
(object-evict X [ALLOCATOR])Copies the object
X
recursively into the memory pointed to by the foreign pointer object returned byALLOCATOR
, which should be a procedure of a single argument (the number of bytes to allocate). The freshly copied object is returned. This facility allows moving arbitrary objects into static memory, but care should be taken when mutating evicted data: setting slots in evicted vector-like objects to non-evicted data is not allowed. It is possible to set characters/bytes in evicted strings or byte-vectors, though. It is advisable not to evict ports, because they might be mutated by certain file-operations.object-evict
is able to handle circular and shared structures, but evicted symbols are no longer unique: a fresh copy of the symbol is created, so(define x 'foo) (define y (object-evict 'foo)) y ==> foo (eq? x y) ==> #f (define z (object-evict '(bar bar))) (eq? (car z) (cadr z)) ==> #tThe
ALLOCATOR
defaults toallocate
.
(object-evict-to-location X PTR [LIMIT])As
object-evict
but moves the object at the address pointed to by the machine pointerPTR
. If the number of copied bytes exceeds the optionalLIMIT
then an error is signalled. Two values are returned: the evicted object and a new pointer pointing to the first free address after the evicted object.
(object-evicted? X)Returns
#t
ifX
is a non-immediate evicted data object, or#f
otherwise.
(object-size X)Returns the number of bytes that would be needed to evict the data object
X
.
(object-release X [RELEASER])Frees memory occupied by the evicted object
X
recursively.RELEASER
should be a procedure of a single argument (a foreign pointer object to the static memory to be freed) and defaults to the C-libraryfree()
.
(object-unevict X)Copies the object
X
and nested objects back into the normal Scheme heap. Symbols are re-interned into the symbol table. Strings and byte-vectors are not copied.
A locative is an object that points to an element of a containing object,
much like a “pointer” in low-level, imperative programming languages like “C”. The element can
be accessed and changed indirectly, by performing access or change operations
on the locative. The container object can be computed by calling the
location->object
procedure.
Locatives may be passed to foreign procedures that expect pointer arguments.
The effect of creating locatives for evicted data (see object-evict
) is undefined.
(make-locative EXP [INDEX])Creates a locative that refers to the element of the non-immediate object
EXP
at positionINDEX
.EXP
may be a vector, symbol, pair, string, byte-vector, SRFI-4 number-vector, SRFI-25 array, or record.INDEX
should be a fixnum, or a valid index into a SRFI-25 array.INDEX
defaults to 0.
(make-weak-locative EXP [INDEX])Creates a “weak” locative. Even though the locative refers to an element of a container object, the container object will still be reclaimed by garbage collection if no other references to it exist.
(locative-ref LOC)Returns the element to which the locative
LOC
refers. If the containing object has been reclaimed by garbage collection, an error is signalled.
(locative-set! LOC X)Changes the element to which the locative
LOC
refers toX
. If the containing object has been reclaimed by garbage collection, an error is signalled.
(locative->object LOC)Returns the object that contains the element referred to by
LOC
or#f
if the container has been reclaimed by garbage collection.
(global-bound? SYMBOL)Returns
#t
, if the global (“toplevel”) variable with the nameSYMBOL
is bound to a value, or#f
otherwise.
(global-ref SYMBOL)Returns the value of the global variable
SYMBOL
. If no variable under that name is bound, an error is signalled.
(global-set! SYMBOL X)Sets the global variable named
SYMBOL
to the valueX
.
(block-ref BLOCK INDEX)Returns the contents of the
INDEX
th slot of the objectBLOCK
.BLOCK
may be a vector, record structure, pair or symbol.
(block-set! BLOCK INDEX X)Sets the contents of the
INDEX
th slot of the objectBLOCK
to the value ofX
.BLOCK
may be a vector, record structure, pair or symbol.
(object-copy X)Copies
X
recursively and returns the fresh copy. Objects allocated in static memory are copied back into garbage collected storage.
(make-record-instance SYMBOL ARG1 ...)Returns a new instance of the record type
SYMBOL
, with its slots initialized toARG1 ...
. To illustrate:(define-record point x y)expands into something quite similar to:
(begin (define (make-point x y) (make-record-instance 'point x y) ) (define (point? x) (and (record-instance? x) (eq? 'point (block-ref x 0)) ) ) (define (point-x p) (block-ref p 1)) (define (point-x-set! p x) (block-set! p 1 x)) (define (point-y p) (block-ref p 2)) (define (point-y-set! p y) (block-set! p 1 y)) )
(move-memory! FROM TO [BYTES])Copies
BYTES
bytes of memory fromFROM
toTO
.FROM
andTO
may be strings, primitive byte-vectors, SRFI-4 byte-vectors (see: Unit srfi-4), memory mapped files, foreign pointers (as obtained from a call toforeign-lambda
, for example) or locatives. ifBYTES
is not given and the size of the source or destination operand is known then the maximal number of bytes will be copied. Moving memory to the storage returned by locatives will cause havoc, if the locative refers to containers of non-immediate data, like vectors or pairs.
(number-of-bytes BLOCK)Returns the number of bytes that the object
BLOCK
contains.BLOCK
may be any non-immediate value.
(number-of-slots BLOCK)Returns the number of slots that the object
BLOCK
contains.BLOCK
may be a vector, record structure, pair or symbol.
(record-instance? X)Returns
#t
ifX
is an instance of a record type. See also:make-record-instance
.
(record->vector BLOCK)Returns a new vector with the type and the elements of the record
BLOCK
.
(invalid-procedure-call-handler PROC)Sets an internal hook that is invoked when a call to an object other than a procedure is executed at runtime. The procedure
PROC
will in that case be called with two arguments: the object being called and a list of the passed arguments.;;; Access sequence-elements as in ARC: (invalid-procedure-call-handler (lambda (proc args) (cond [(string? proc) (apply string-ref proc args)] [(vector? proc) (apply vector-ref proc args)] [else (error "call of non-procedure" proc)] ) ) ) ("hello" 4) ==> #\oThis facility does not work in code compiled with the “unsafe” setting.
(unbound-variable-value [X])Defines the value that is returned for unbound variables. Normally an error is signalled, use this procedure to override the check and return
X
instead. To set the default behavior (of signalling an error), callunbound-variable-value
with no arguments.This facility does not work in code compiled with the “unsafe” setting.
(object-become! ALIST)Changes the identity of the value of the car of each pair in
ALIST
to the value of the cdr. Both values may not be immediate (i.e. exact integers, characters, booleans or the empty list).(define x "i used to be a string") (define y '#(and now i am a vector)) (object-become! (list (cons x y))) x ==> #(and now i am a vector) y ==> #(and now i am a vector) (eq? x y) ==> #tNote: this operation invokes a major garbage collection.
The effect of using
object-become!
on evicted data (seeobject-evict
) is undefined.
This unit is a port of Gregor Kiczales TinyCLOS with numerous modifications.
This unit uses the extras
unit.
(define-class NAME (SUPERCLASS1 ...) (SLOTNAME1 ...) [METACLASS])Sets the variable
NAME
to a new class (a new instance of the class<class>
).SUPERCLASS1 ...
is a list of superclasses of the newly created class. If no superclasses are given, then<object>
is assumed.SLOTNAME1 ...
are the names of the direct slots of the class. ifMETACLASS
is provided, then the new class-instance is an instance ofMETACLASS
instead of<class>
.(define-class NAME (SUPER) (SLOT1 SLOT2) META)is equivalent to
(define NAME (make META 'name 'NAME 'direct-supers (list SUPER) 'direct-slots (list 'SLOT1 'SLOT2)) )Note that slots-names are not required to be symbols, so the following is perfectly valid:
(define hidden-slot (list 'hidden)) (define <myclass> (make <class> 'direct-supers (list <object>) 'direct-slots (list hidden-slot) ) ) (define x1 (make <myclass>) (slot-set! x1 hidden-slot 99)
(define-generic NAME [CLASS])Sets the variable
NAME
to contain a fresh generic function object without associated methods. If the optional argumentCLASS
is given, then the generic function will be an instance of that class.
(define-method (NAME (VARIABLE1 CLASS1) ... PARAMETERS ...) BODY ...)Adds a new method with the code
BODY ...
to the generic function that was assigned to the variablename
.CLASS1 ...
is a list if classes that specialize this particular method. The method can have additional parametersPARAMETERS
, which do not specialize the method any further. Inside the body of the method the identifiercall-next-method
names a procedure of zero arguments that can be invoked to call the next applicable method with the same arguments. If no generic function is defined under this name, then a fresh generic function object is created and assigned toNAME
. Note that onlydefine-generic
expands into a valid definition, so for internal lexically scoped definitions or for definitions for module exports (seesyntax-case
) usedefine-generic
.
(add-method GENERIC METHOD)Adds the method object
METHOD
to the list of applicable methods for the generic functionGENERIC
.
(make CLASS INITARG ...)Creates a new instance of
CLASS
and passesINITARG ...
to theinitialize
method of this class.
(make-class SUPERCLASSES SLOTNAMES)Creates a new class object, where
SUPERCLASSES
should be the list of direct superclass objects andSLOTNAMES
should be a list of symbols naming the slots of this class.
(make-generic [NAME])Creates a new generic function object. If
NAME
is specified, then it should be a string.
(make-method SPECIALIZERS PROC)Creates a new method object specialized to the list of classes in
SPECIALIZERS
.(define-method (foo (x <bar>)) 123) <=> (add-method foo (make-method (list <bar>) (lambda (call-next-method x) 123)))
(slot-ref INSTANCE SLOTNAME)Returns the value of the slot
SLOTNAME
of the objectINSTANCE
.
(slot-set! INSTANCE SLOTNAME VALUE)Sets the value of the slot
SLOTNAME
of the objectINSTANCE
toVALUE
.
(class-cpl CLASS)Returns the class-precedence-list of
CLASS
as a list of classes.
(class-direct-slots CLASS)Returns the list of direct slots of
CLASS
as a list of lists, where each sublist contains the name of the slot.
(class-direct-supers CLASS)Returns the list of direct superclasses of
CLASS
.
(class-slots CLASS)Returns the list of all slots of
CLASS
and its superclasses as a list of lists, where each sublist contains the name of the slot.
(generic-methods GENERIC)Returns the list of all methods associated with the generic function
GENERIC
.
(method-specializers METHOD)Returns the list of classes that specialize
METHOD
.
(method-procedure METHOD)Returns the procedure that contains the body of
METHOD
.
(subclass? CLASS1 CLASS2)Returns
#t
isCLASS1
is a subclass ofCLASS2
, or#f
otherwise. Note that the following holds:(subclass? X X) ==> #t
These definitions allow interfacing to the Meta Object Protocol
of TinyCLOS. For serious use, it is recommended to consult
the source code (tinyclos.scm
).
(allocate-instance CLASS)Allocates storage for an instance of
CLASS
and returns the instance.
(compute-apply-generic GENERIC)Returns a procedure that will be called to apply the generic function methods to the arguments.
(compute-apply-methods GENERIC)Returns a procedure of two arguments, a list of applicable methods and a list of arguments and applies the methods.
(compute-methods GENERIC)Returns a procedure of one argument. The procedure is called with the list of actual arguments passed to the generic function and should return a list of applicable methods, sorted by precedence.
(compute-getter-and-setter CLASS SLOT ALLOCATOR)Returns two values, the procedures that get and set the contents of the slot
SLOT
.ALLOCATOR
is a procedure of one argument (I currently don't know what it does).
(compute-method-more-specific? GENERIC)Returns a procedure of three arguments (two methods and a list of arguments) that returns
#t
if the first method is more specific than the second one with respect to the list of arguments. Otherwise the returned predicate returns#f
.
(initialize INSTANCE INITARGS)Initializes the object
INSTANCE
.INITARGS
is the list of initialization arguments that were passed to themake
procedure.
(describe-object INSTANCE PORT)Writes a description of
INSTANCE
toPORT
. Execution of the interpreter command,d
will invoke this generic function.
(print-object INSTANCE PORT)Writes a textual representation of
INSTANCE
toPORT
. Any output of an instance withdisplay, write
and
(initialize-slots INSTANCE INITARGS)This procedure takes a sequence of alternating slot-names and initialization values in
INITARGS
and initializes the corresponding slots inINSTANCE
.(define-class <pos> () (x y)) (define-method (initialize (pos <pos>) initargs) (call-next-method) (initialize-slots pos initargs)) (define p1 (make <pos> 'x 1 'y 2)) (define p2 (make <pos> 'x 3 'y 5))
The class hierarchy of builtin classes looks like this:
<top> <object> <class> <procedure-class> <procedure> <entity-class> <generic> <primitive-class> <c++-object> <primitive> <void> <boolean> <symbol> <char> <vector> <pair> <number> <integer> <exact> <inexact> <string> <port> <input-port> <output-port> <pointer> <tagged-pointer> <locative> <byte-vector> <u8vector> <s8vector> <u16vector> <s16vector> <u32vector> <s32vector> <f32vector> <f64vector> <structure> <array> <char-set> <condition> <environment> <hash-table> <lock> <mmap> <promise> <queue> <tcp-listener> <time> <end-of-file>— class: <boolean> -> <primitive>
— class: <symbol> -> <primitive>
— class: <char> -> <primitive>
— class: <vector> -> <primitive>
— class: <null> -> <primitive>
— class: <pair> -> <primitive>
— class: <number> -> <primitive>
— class: <integer> -> <primitive>
— class: <exact> -> <integer>
— class: <inexact> -> <number>
— class: <string> -> <primitive>
— class: <port> -> <primitive>
— class: <environment> -> <structure>
— class: <end-of-file> -> <primitive>
— class: <input-port> -> <port>
— class: <output-port> -> <port>
— class: <procedure> -> <procedure-class>
The classes of primitive Scheme objects.
— class: <byte-vector> -> <primitive>
— class: <structure> -> <primitive>
— class: <hash-table> -> <structure>
— class: <queue> -> <structure>
The classes of extended data types provided by the various library units.
— class: <entity-class> -> <class>
The parent class of objects that can be invoked as a procedure and have slots.
— class: <procedure-class> -> <class>
The parent class of objects that can be invoked as a procedure.
— class: <array> -> <structure>
— class: <char-set> -> <structure>
— class: <time> -> <structure>
— class: <u8vector> -> <byte-vector>
— class: <s8vector> -> <byte-vector>
— class: <u16vector> -> <byte-vector>
— class: <s16vector> -> <byte-vector>
— class: <u32vector> -> <byte-vector>
— class: <s32vector> -> <byte-vector>
— class: <f32vector> -> <byte-vector>
— class: <f64vector> -> <byte-vector>
The classes of data objects provided by the various supported SRFIs.
— class: <lock> -> <structure>
— class: <mmap> -> <structure>
Classes of objects used in the
posix
library unit.— class: <pointer> -> <primitive>
— class: <tagged-pointer> -> <pointer>
A machine pointer (untagged, or tagged).
— class: <c++-class> -> <object>
The class of generated wrappers for C++ classes parsed by the “easy” Foreign Function interface.
The CHICKEN distribution provides several examples in the file
tinyclos-examples.scm
.6 Interface to external functions and variables
(foreign-code STRING)Executes the embedded C/C++ code
STRING
, which should be a sequence of C statements, which are executed and return an unspecified result.(foreign-code "doSomeInitStuff();") => #<unspecified>
(foreign-value STRING TYPE)Evaluates the embedded C/C++ expression
STRING
, returning a value of type given in the foreign-type specifierTYPE
.(print (foreign-value "my_version_string" c-string))
(define-foreign-type NAME TYPE [ARGCONVERT [RETCONVERT]])Defines an alias for
TYPE
with the nameNAME
(a symbol).TYPE
may be a type-specifier or a string naming a C type. The namespace of foreign type specifiers is separate from the normal Scheme namespace. The optional argumentsARGCONVERT
andRETCONVERT
should evaluate to procedures that map argument- and result-values to a value that can be transformed toTYPE
:(require-extension extras) (define-foreign-type char-vector nonnull-c-string (compose list->string vector->list) (compose list->vector string->list) ) (define strlen (foreign-lambda int "strlen" char-vector) ) (strlen '#(#\a #\b #\c)) ==> 3 (define memset (foreign-lambda char-vector "memset" char-vector char int) ) (memset '#(#_ #_ #_) #\X 3) ==> #(#\X #\X #\X)Foreign type-definitions are only visible in the compilation-unit in which they are defined, so use
include
to use the same definitions in multiple files.
(define-foreign-variable NAME TYPE [STRING])Defines a foreign variable of name
NAME
(a symbol).STRING
should be the real name of a foreign variable or parameterless macro. IfSTRING
is not given, then the variable nameNAME
will be converted to a string and used instead. All references and assignments (viaset!
) are modified to correctly convert values between Scheme and C representation. This foreign variable can only be accessed in the current compilation unit, but the name can be lexically shadowed. Note thatSTRING
can name an arbitrary C expression. If no assignments are performed, thenSTRING
doesn't even have to specify an lvalue.#> enum { abc=3, def, ghi }; <# (define-macro (define-foreign-enum . items) `(begin ,@(map (match-lambda [(name realname) `(define-foreign-variable ,name int ,realname)] [name `(define-foreign-variable ,name int)] ) items) ) ) (define-foreign-enum abc def ghi) ghi ==> 5
(define-foreign-record NAME SLOT ...)Defines accessor procedures for a C structure definition.
NAME
should either be a symbol or a list of the form(TYPENAME FOREIGNNAME)
. IfNAME
is a symbol, then a C declaration will be generated that defines a C struct namedstruct NAME
. IfNAME
is a list, then no struct declaration will be generated. A foreign-type specifier namedNAME
(orTYPENAME
) will be defined as a pointer to the given C structure. ASLOT
definition should be a list of one of the following forms:(TYPE SLOTNAME)or
(TYPE SLOTNAME SIZE)The latter form defines an array of SIZE elements of the type TYPE embedded in the structure. For every slot, the following accessor procedures will be generated:
— procedure: TYPENAME-SLOTNAME
(TYPENAME-SLOTNAME FOREIGN-RECORD-POINTER [INDEX])A procedure of one argument (a pointer to a C structure), that returns the slot value of the slot
SLOTNAME
. If aSIZE
has been given in the slot definition, then an additional argumentINDEX
is required that specifies the index of an array-element.— procedure: TYPENAME-SLOTNAME-set!
(TYPENAME-SLOTNAME-set! FOREIGN-RECORD-POINTER [INXDEX] VALUE)A procedure of two arguments (a pointer to a C structure) and a value, that sets the slot value of the slot
SLOTNAME
in the structure. If aSIZE
has been given in the slot definition, then an additional argumentINDEX
is required for the array index.If a slot type is of the form
(const ...)
, then no setter procedure will be generated. Slots of the types(struct ...)
or(union ...)
are accessed as pointers to the embedded struct (or union) and no setter will be generated.
(foreign-callback-lambda RETURNTYPE NAME ARGTYPE ...)This is similar to
foreign-lambda
, but also allows the called function to call Scheme functions. See Callbacks.
(foreign-callback-lambda* RETURNTYPE ((ARGTYPE VARIABLE)...) STRING ...)This is similar to
foreign-lambda*
, but also allows the called function to call Scheme functions. See Callbacks.
(foreign-lambda RETURNTYPE NAME ARGTYPE ...)Represents a binding to an external routine. This form can be used in the position of an ordinary
lambda
expression.NAME
specifies the name of the external procedure and should be a string or a symbol.
(foreign-lambda* RETURNTYPE ((ARGTYPE VARIABLE) ...) STRING ...)Similar to
foreign-lambda
, but instead of generating code to call an external function, the body of the C procedure is directly given inSTRING ...
:(define my-strlen (foreign-lambda* int ((c-string str)) "int n = 0; while(*(str++)) ++n; return(n);") ) (my-strlen "one two three") ==> 13For obscure technical reasons any use of the
return
statement should enclose the result value in parentheses. For the same reasonsreturn
without an argument is not allowed.
Here is a list of valid foreign type specifiers:
scheme-object
bool
#f
is false, anything else is true).
As result: anything different from 0 and the NULL
-pointer
is #t
.
byte unsigned-byte
char unsigned-char
short unsigned-short
int unsigned-int
integer unsigned-integer
long unsigned-long
float double
pointer
#f
is also allowed
and is passed as a NULL
pointer.
nonnull-pointer
pointer
, but guaranteed not to be #f
.
c-pointer
#f
is also
allowed and is passed as a NULL
pointer. If uses as the type of
a return value, a NULL
pointer will be returned as #f
.
nonnull-c-pointer
c-pointer
, but guaranteed not to be #f/NULL
.
[nonnull-] byte-vector
byte-vector
may optionally be #f
, which is
passed as a NULL pointer. This is not allowed as a return type.
[nonnull-] u8vector
[nonnull-] u16vector
[nonnull-] u32vector
[nonnull-] s8vector
[nonnull-] s16vector
[nonnull-] s32vector
[nonnull-] f32vector
[nonnull-] f64vector
byte-vector
may optionally be
#f
, which is passed as a NULL pointer. These are not allowed
as return types.
c-string
#f
is also allowed and is passed as a NULL
pointer. If uses as
the type of a return value, a NULL
pointer will be returned as
#f
. Note that the string is copied (with a zero-byte appended)
when passed as an argument to a foreign function. Also a return value
of this type is copied into garbage collected memory.
nonnull-c-string
c-string
, but guaranteed not to be #f/NULL
.
[nonnull-] c-string*
[nonnull-]c-string
, but if used as a result-type,
the pointer returned by the foreign code will be freed (using the
C-libraries free()
)
after copying.
void
(const TYPE)
TYPE
with an additional const
specifier.
(enum NAME)
integer
.
(pointer TYPE)
(c-pointer TYPE)
TYPE
.
(nonnull-pointer TYPE)
(nonnull-c-pointer TYPE)
(pointer TYPE)
, but guaranteed not to be #f/NULL
.
(ref TYPE)
(struct NAME)
NAME
, which should be a string. Structs
can not be directly passed as arguments to foreign function, neither
can they be result values. Pointers to structs are allowed, though.
(template TYPE ARGTYPE ...)
vector<int>
would be specified
as (template "vector" int)
. Template types can not be directly passed
as arguments or returned as results.
(union NAME)
NAME
, which should be a string. Unions can
not be directly passed as arguments to foreign function, neither can
they be result values. Pointers to unions are allowed, though.
(instance CNAME SCHEMECLASS)
CNAME
should designate
the name of the C++ class, and SCHEMECLASS
should be the class
that wraps the instance pointer. Normally SCHEMECLASS
should be a subclass of <c++-object>
.
(function RESULTTYPE (ARGUMENTTYPE1 ... [...]) [CALLCONV])
CALLCONV
specifies an optional calling
convention and should be a string. The meaning of this string is entirely
platform dependent. The value #f
is also allowed and is passed
as a NULL
pointer.
Foreign types are mapped to C types in the following manner:
bool
[unsigned-]char
[unsigned-]short
[unsigned-]int
[unsigned-]integer
[unsigned-]long
float
double
[nonnull-]pointer
[nonnull-]c-pointer
[nonnull-]byte-vector
[nonnull-]u8vector
[nonnull-]s8vector
[nonnull-]u16vector
[nonnull-]s16vector
[nonnull-]u32vector
[nonnull-]s32vector
[nonnull-]f32vector
[nonnull-]f64vector
[nonnull-]c-string
void
([nonnull-]pointer TYPE)
(enum NAME)
(struct NAME)
(ref TYPE)
(template T1 T2 ...)
(union NAME)
(function RTYPE (ATYPE ...) [CALLCONV])
To simplify embedding compiled Scheme code into arbitrary programs, one can define so called “entry points”, which provide a uniform interface and parameter conversion facilities. To use this facility, add
(include "chicken-entry-points")
to the beginning of your code.
(define-entry-point INDEX ((VAR1 TYPE1) ...) (RTYPE1 ...) EXP1 EXP2 ...)Defines a new entry-point with index
INDEX
which should evaluate to an exact integer. During execution of the bodyEXP1 EXP2 ...
the variablesVAR1 ...
are bound to the parameters passed from the host program to the invoked entry point. The parameters passed are converted according to the foreign type specifiersTYPE1 ...
. The expressions should return as many values as foreign type specifiers are given inRTYPE1 ...
, with the exception that if the list of return types is empty, a single value is expected to be returned from the body (there is no need to add a(values)
form at the end). The results are then transformed into values that can be used in the host program.Note: if one or more of the result types
RTYPE ...
specify the typec-string
, then the parameter types at the same positions inTYPE1 ...
have to bec-string
s as well, because the result strings are copied into the same area in memory. You should also take care that the passed buffer is long enough to hold the result string or unpredictable things will happen.If entry points were defined then the program will not terminate after execution of the last toplevel expression, but instead it will enter a loop that waits for the host to invoke one of the defined entry points.
(define-embedded [QUALIFIER ... ] ([CCONV] NAME (TYPE1 VAR1) ...) RTYPE BODY ...)Defines a named entry-point that can be accessed from external code with a normal C/C++ function call.
QUALIFIER
may be a string for special function declarations (like__declspec(dllexport)
on Windows, for example) andCCONV
may be a string designating a calling convention (like__cdecl
). During the execution of theBODY
the variablesVAR1 ...
are bound to the arguments passed to the function, which should be of types compatible to the type specifiersTYPE1 ...
.RTYPE
specifies the result type of the entry-point. The return type specifiers[nonnull-]c-string
and[nonnull-]c-string*
are handled specially: if the return type isc-string
, a heap-allocated pointer to a zero-terminated string will be returned, which will be valid until the next invocation of an entry-point into the Scheme code. If the return type isc-string*
, a buffer allocated withmalloc
will be returned, and freeing the string is the responsibility of the caller.All entry-point definitions with
define-embedded
should be put into the same source file.define-embedded
expands into adefine-entry-point
form and the entry-point index is provided by the macro (starting from 1). Ifdefine-embedded
is used in multiple source files then the index is counted from 1 in each of the files, resulting in multiple entry-points with the same index.
The following C functions and data types are provided:
Parse the programs command-line contained in
argc
andargv
and return the heap-, stack- and symbol table limits given by runtime options of the form-:...
, or choose default limits. The library procedureargv
can access the command-line only if this function has been called by the containing application.
Initializes the Scheme execution context and memory.
heap
holds the number of bytes that are to be allocated for the secondary heap.stack
holds the number of bytes for the primary heap.symbols
contains the size of the symbol table. Passing0
to one or more of these parameters will select a default size.toplevel
should be a pointer to the toplevel entry point procedure. You should passC_toplevel
here. In any subsequent call toCHICKEN_run
orCHICKEN_invoke
you can simply passNULL
. Calling this function more than once has no effect. If enough memory is available and initialization was successful, then1
is returned, otherwise this function returns0
.
Starts the Scheme program.
data, bytes
andmaxlen
contain invocation parameters in raw form. PassNULL
here. Call this function once to execute all toplevel expressions in your compiled Scheme program. If the runtime system was not initialized before, thenCHICKEN_initialize
is called with default sizes.toplevel
is the toplevel entry-point procedure.
Invoke the entry point with index
index
.count
should contain the maximum number of arguments or results (whatever is higher).params
is a pointer to parameter data:typedef union { C_word x; /* parameter type scheme-object */ long i; /* parameter type bool, [unsigned] int/short/long */ long c; /* parameter type [unsigned] char */ double f; /* parameter type float/double */ void *p; /* any pointer parameter type and C strings */ } C_parameter;This function calls
CHICKEN_run
if it was not called at least once before.
Returns
1
, if called inside a dynamic context invoked viaCHICKEN_run
orCHICKEN_invoke
(i.e. if running inside a call from Scheme to C). If no Scheme stack frame is currently active, then this function returns0
.
Here is a simple example (assuming a UNIX-like environment):
% cat foo.c #include <stdio.h> #include "chicken.h" int main(void) { C_parameter p[ 3 ]; char str[ 32 ] = "hello!"; /* We need some space for the result string! */ memset(p, 0, sizeof(p)); p[ 0 ].i = -99; p[ 1 ].p = str; p[ 2 ].f = 3.14; CHICKEN_invoke(1, p, 3, C_toplevel); printf("->\n%d\n%s\n", p[ 0 ].i, p[ 1 ].p); return 0; } % cat bar.scm (include "chicken-entry-points") (define-entry-point 1 ((a integer) (b c-string) (c double)) (int c-string) (print (list a b c)) (values 123 "good bye!") ) % chicken bar.scm -quiet % gcc foo.c bar.c -o foo `chicken-config -cflags -libs -embedded` % foo (-99 "hello!" 3.14) -> 123 good bye!
Note the use of -embedded
. We have to compile with additional compiler
options, because the host program provides the main
function.
Here another example that uses named entry-points defined with define-embedded
:
% cat foo.c extern int foo(int, char *); extern unsigned int square(double); int main() { foo(square(9), "yo!"); return 0; } % cat bar.scm (include "chicken-entry-points") (define-embedded (foo (int x) (c-string y)) int (print x ": " y) x) (define-embedded (square (double x)) unsigned-int (* x x)) % chicken bar.scm compiling `bar.scm' ... % gcc foo.c bar.c `chicken-config -cflags -libs -embedded` % a.out 81: yo!
CHICKEN also provides “boilerplate” entry points, that simplify invoking Scheme
code embedded in a C or C++ application tremendously. The include file default-entry-points.scm
will define entry-points for common usage patterns, like loading a file, evaluating an expression
or calling a procedure.
Evaluates the Scheme object passed in
exp
, writing the result value toresult
.status
is set to 1 if the operation succeeded, or 0 if an error occurred. CallCHICKEN_get_error_message
to obtain a description of the error.
Evaluates the Scheme expression passed in the string
str
, writing the result value toresult
.
Evaluates the Scheme expression passed in
exp
, writing a textual representation of the result intoresult
.size
should specify the maximal size of the result string.
Evaluates the Scheme expression passed in the string
str
, writing a textual representation of the result intoresult
.size
should specify the maximal size of the result string.
Applies the procedure passed in
func
to the list of argumentsargs
, writing the result value toresult
.
Applies the procedure passed in
func
to the list of argumentsargs
, writing a textual representation of the result intoresult
.
Reads a Scheme object from the string
str
, writing the result value toresult
.
Loads the Scheme file
filename
(either in source form or compiled).
Returns a textual description, in case an error occurred while invoking embedded Scheme code.
If threads have been spawned during earlier invocations of embedded Scheme code, then this function will run the next scheduled thread for one complete time-slice. This is useful, for example, inside an “idle” handler in a GUI application with background Scheme threads.
An example:
% cat x.scm ;;; x.scm (include "chicken-default-entry-points") (define (bar x) (gc) (* x x)) % cat y.c /* y.c */ #include "chicken.h" #include <assert.h> int main() { char buffer[ 256 ]; int status; C_word val = C_SCHEME_UNDEFINED; C_word *data[ 1 ]; data[ 0 ] = &val; CHICKEN_read("(bar 99)", &val, &status); assert(status); C_gc_protect(data, 1); printf("data: %08x\n", val); CHICKEN_eval_string_to_string("(bar)", buffer, 255, &status); assert(!status); CHICKEN_get_error_message(buffer, 255); printf("ouch: %s\n", buffer); CHICKEN_eval_string_to_string("(bar 23)", buffer, 255, &status); assert(status); printf("-> %s\n", buffer); printf("data: %08x\n", val); CHICKEN_eval_to_string(val, buffer, 255, &status); assert(status); printf("-> %s\n", buffer); return 0; } % csc x.scm y.c -embedded
A simpler interface For handling GC-safe references to Scheme data are the so called “gc-roots”:
Returns a pointer to a “GC root”, which is an object that holds a reference to a Scheme value that will always be valid, even after a garbage collection. The content of the gc root is initialized to an unspecified value.
Sets the content of the GC root to a new value.
Sometimes it is handy to access global variables from C code:
Returns a GC root that holds the global variable with the name
name
. If no such variable exists,NULL
is returned.
Returns the value of the global variable referenced by the GC root
global
.
Sets the value of the global variable referenced by the GC root
global
tovalue
.
To enable an external C function to call back to Scheme, the form
foreign-callback-lambda
(or foreign-callback-lambda*
)
has to be used. This generates special code to save and restore important
state information during execution of C code. There are two ways of
calling Scheme procedures from C: the first is to invoke the runtime
function C_callback
with the closure to be called and the number
of arguments. The second is to define an externally visible wrapper
function around a Scheme procedure with the define-external
or foreign-callback-wrapper
forms.
Note: the names of all functions, variables and macros exported by the
CHICKEN runtime system start with “C_
”. It is advisable to
use a different naming scheme for your own code to avoid name clashes.
Callbacks (either defined by define-external
or foreign-callback-wrapper
do not capture the lexical environment.
(define-external [QUALIFIERS] (NAME (ARGUMENTTYPE1 VARIABLE1) ...) RETURNTYPE BODY ...) (define-external NAME TYPE [INIT])The first form defines an externally callable Scheme procedure.
NAME
should be a symbol, which, when converted to a string, represents a legal C identifier.ARGUMENTTYPE1 ...
andRETURNTYPE
are foreign type specifiers for the argument variablesVAR1 ...
and the result, respectively.QUALIFIERS
is an optional qualifier for the foreign procedure definition, like__stdcall
.(define-external (foo (c-string x)) int (string-length x))is equivalent to
(define foo (foreign-callback-wrapper int "foo" (c-string) (lambda (x) (string-length x))))The second form of
define-external
can be used to define variables that are accessible from foreign code. It declares a global variable named by the symbolNAME
that has the typeTYPE
.INIT
can be an arbitrary expression that is used to initialize the variable.NAME
is accessible from Scheme just like any other foreign variable defined bydefine-foreign-variable
.(define-external foo int 42) ((foreign-lambda* int () "return(foo);")) ==> 42Note: don't be tempted to assign strings or bytevectors to external variables. Garbage collection moves those objects around, so it is very bad idea to assign pointers to heap-data. If you have to do so, then copy the data object into statically allocated memory (for example by using
object-evict
).
(foreign-callback-wrapper RETURNTYPE NAME [QUALIFIERS] (ARGUMENTTYPE1 ...) EXP)Defines an externally callable wrapper around the procedure
EXP
.EXP
must be a lambda expression of the form(lambda ...)
. The wrapper will have the nameNAME
and will have a signature as specified in the return- and argument-types given inRETURNTYPE
andARGUMENTTYPE1 ...
.QUALIFIERS
is a qualifier string for the function definition (seedefine-external
).
This function can be used to invoke the Scheme procedure
closure
.argc
should contain the number of arguments that are passed to the procedure on the temporary stack. Values are put onto the temporary stack with theC_save
macro.
It is also possible to define variables containing unboxed C data, so called locations. It should be noted that locations may only contain simple data, that is: everything that fits into a machine word, and double-precision floating point values.
(define-location NAME TYPE [INIT])Identical to
(define-external NAME TYPE [INIT])
, but the variable is not accessible from outside of the current compilation unit (it is declaredstatic
).
(let-location ((NAME TYPE [INIT]) ...) BODY ...)Defines a lexically bound location.
(location NAME) (location X) NAME define-externalor
let-location
. This form returns a pointer object that contains the address of the variableNAME
. If the argument tolocation
is not a location defined bydefine-location
,define-external
orlet-location
, then(location X)is essentially equivalent to
(make-locative X)(See the manual chapter or
locatives
for more information about locatives.Note that
(location X)
may be abbreviated as#$X
.(define-external foo int) ((foreign-lambda* void (((pointer int) ip)) "*ip = 123;") (location foo)) foo ==> 123This facility is especially useful in situations, where a C function returns more than one result value:
#> #include <math.h> <# (define modf (foreign-lambda double "modf" double (pointer double)) ) (let-location ([i double]) (let ([f (modf 1.99 (location i))]) (print "i=" i ", f=" f) ) )
location
returns a value of type c-pointer
, when given
the name of a callback-procedure defined with define-external
.
(argc+argv)Returns two values: an integer and a foreign-pointer object representing the
argc
andargv
arguments passed to the current process.
The compiler contains a builtin parser for a restricted subset of C and C++ that
allows the easy generation of foreign variable declarations, procedure bindings and
C++ class wrappers. The parser is invoked via the declaration-specifier
foreign-parse
, which extracts binding information and generates
the necessary code. An example:
(declare (foreign-declare " #include <math.h> #define my_pi 3.14 ") (foreign-parse "extern double sin(double);") ) (print (sin 3.14))
The parser would generate code that is equivalent to
(declare (foreign-declare " #include <math.h> #define my_pi 3.14 ") (define-foreign-variable my_pi float "my_pi") (define sin (foreign-lambda double "sin" double))
Note that the read syntax #>[SPEC] ... <#
provides a somewhat simpler way of using the parser. The example above could
alternatively be expressed as
#>! #define my_pi 3.14 extern double sin(double); <# (print (sin 3.14))
Another example, here using C++. Consider the following class:
// file: foo.h class Foo { private: int x_; public: Foo(int x); void setX(int x); int getX(); };
To generate a wrapper class that provides generic functions for the
constructor and the setX
and getX
methods, we
can use the following class definition:
; file: test-foo.scm #>! #include "Foo.h" <# (define x (make <Foo> 99)) (print (getX x)) ; prints ``99'' (setX x 42) (print (getX x)) ; prints ``42'' (destroy x)
Provided the file foo.o
contains the implementation of the class Foo
, the
given example could be compiled like this (assuming a UNIX like environment):
% csc test-foo.scm foo.o -c++
Here is another example, a minimal “Hello world” application for QT. We can see the three different ways of embedding C/C++ code in Scheme:
; compile like this: ; csc hello.scm -c++ -C -IQTDIR/include -L "-LQTDIR/lib -lqt" ; Include into generated code, but don't parse: #> #include <qapplication.h> #include <qpushbutton.h> <# ; Parse but don't embed: we only want wrappers for a few classes: #>? class QWidget { public: void resize(int, int); void show(); }; class QApplication { public: QApplication(int, char **); ~QApplication(); void setMainWidget(QWidget *); void exec(); }; class QPushButton : public QWidget { public: QPushButton(char *, QWidget *); ~QPushButton(); } <# (define a (apply make <QApplication> (receive (argc+argv)))) (define hello (make <QPushButton> "hello world!" #f)) (resize hello 100 30) (setMainWidget a hello) (show hello) (exec a) (destroy hello) (destroy a)
#> ... <#
SyntaxOccurrences of the special read syntax #>[SPEC ...] ...<#
will be handled according to
SPEC
:
If SPEC
is the ?
character, the text following up to the next <#
will be processed as a (declare (foreign-parse "..."))
declaration (the code will be processed
by the FFI parser described in this section).
If SPEC
is the !
character, the text will be embedded as
(declare (foreign-declare "...") (foreign-parse "...") )
It will be both included verbatim in the declaration section of the generated C/C++ file and processed by the FFI parser.
If SPEC
is the :
character the text will be embedded as a (foreign-code "...")
form,
so it will be executed at the location where it appears.
If SPEC
is a list of the form (TAG ...)
, then each TAG
(which should be a symbol)
specifies what should be done with the text:
declare
parse
execute
If any other character follows the #>
, then the complete text will be included verbatim in the declaration
part of the generated file (as in a foreign-declare
declaration).
The parser will generally perform the following functions
1) Translate macro, enum-definitions and constants into define-foreign-variable
or define-constant
forms
2) Translate function prototypes into foreign-lambda
forms
3) Translate variable declarations into accessor procedures
4) Handle basic preprocessor operations
5) Translate simple C++ class definitions into TinyCLOS wrapper classes and methods
Basic token-substitution of macros defined via #define
is performed. The
preprocessor commands #ifdef
, #ifndef
, #else
, #endif
, #undef
and #error
are handled. The preprocessor commands #if
and #elif
are not supported and will signal
an error when encountered by the parser, because C expressions (even if constant) are not parsed.
The preprocessor command #pragma
is allowed but will be ignored.
During processing of foreign-parse
declarations the macro CHICKEN
is defined (similar
to the C compiler option -DCHICKEN
).
Macro- and type-definitions are available in subsequent foreign-parse
forms.
C variables declared generate a procedure with zero or one argument with the same name
as the variable. When called with no arguments, the procedure returns the current value of the
variable. When called with an argument, then the variable is set to the value of that argument.
Structs are not supported. C and C++ style comments are supported. Variables declared as const
will generate normal Scheme variables, bound to the initial value of the variable.
Function-, member-function and constructor/destructor definitions may be preceded by the __callback
qualifier, which marks the function as performing a callback into Scheme. If a wrapped function
calls back into Scheme code, and __callback
has not been given very strange and hard to debug
problems will occur. Member functions prefixed with __discard
and a result type that maps to
a Scheme string (c-string
), will have their result type changed to c-string*
instead.
Constants (as declared by #define
or enum
) are not visible outside of the current
Compilation units unless the export_constants
pseudo declaration has been used.
When given the option -ffi
, CHICKEN will compile a C/C++ file in “Scheme” mode, that is,
it wraps the C/C++ source inside #>! ... <#
and compiles it while generating Scheme
bindings for exported definitions.
Keep in mind that this is not a fully general C/C++ parser. Taking an arbitrary headerfile and feeding it to CHICKEN will in most cases not work or generate riduculuous amounts of code. This FFI facility is for carefully written headerfiles, and for declarations directly embedded into Scheme code.
Using the __declare(DECL, VALUE)
form, pseudo declarations can be embedded into
processed C/C++ code to provide additional control over the wrapper generation. Pseudo declarations
will be ignored when processed by the system's C/C++ compiler.
<string>
as being abstract, i.e. no constructor will
be defined. Alternatively, a class definition may be prefixed with __abstract
.
set-finalizer!
so that any unused references to
instances of subsequently defined C++ class wrappers will be destroyed. This should be used
with care: if the embedded C++ object which is represented by the reclaimed TinyCLOS instance
is still in use in foreign code, then unpredictable things will happen.
destroy
.
#define
or enum
),
making the constant available outside the current compilation unit. Use the values
yes
/1
for switching constant export on, or no
/0
for switching
it off.
catch
forms that perform any actions
that should be taken in case an exception is thrown by the wrapped member function:
#>! __declare(exception_handler, "catch(...) { return 0; }") class Foo { public: Foo *bar(bool f) { if(f) throw 123; else return this; } }; <# (define f1 (make <Foo>)) (print (bar f1 #f)) (print (bar f1 #t))
will print <Foo>
and #f
, respectively.
char
bool
c-string
unsigned-char
byte
unsigned-byte
[unsigned-]int
[unsigned-]short
[unsigned-]long
[unsigned-]integer
float
double
(enum _)char
(const T)char
(function ...)
c-pointer
(pointer _)
(c-pointer _)
u8vector
s8vector
u16vector
s16vector
u32vector
s32vector
f32vector
f64vector
All other foreign types are specialized as <top>
.
Full specialization can be enabled globally, or only for sections of code by enclosing it in
__declare(full_specialization, yes) ... int foo(int x); int foo(char *x); ... __declare(full_specialization, no)
Alternatively, member function definitions may be prefixed by __specialize
for specializing
only specific members.
Sets a prefix that should be be added to all generated Scheme identifiers. For example
__declare(prefix, "mylib:") #define SOME_CONST 42
would generate the following code:
(define-constant mylib:SOME_CONST 42)
To switch prefixing off, use the values no
or 0
.
Defines to what a certain C/C++ name should be renamed. The value for this declaration
should have the form "<c-name>;<scheme-name>"
, where <c-name>
specifies
the C/C++ identifier occurring in the parsed text and <scheme-name>
gives
the name used in generated wrapper code.
Embeds the Scheme expression <string>
in the generated Scheme code.
Declares a name-substitution for all generated Scheme identifiers. The value for this
declaration should be a string containing a regular expression and a replacement string
(seperated by the ;
character):
__declare(substitute, "^SDL_;sdl:") extern void SDL_Quit();
generates
(define sdl:Quit (foreign-lambda integer "SDL_Quit") )
Defines an arbitrary transformation procedure for names that match a given regular expression.
The value should be a string containing a regular expression and a Scheme expression that
evaluates to a procedure of one argument. If the regex matches, the procedure will be called
at compile time with the match-result (as returned by string-match
) and should return
a string with the desired transformations applied:
(require-for-syntax 'srfi-13) #>! __declare(transform, "([A-Z]+)_(.*);(lambda (x) (string-append (cadr x) \"-\" (string-downcase (caddr x))))") void FOO_Bar(int x) { return x * 2; } <# (print (FOO-bar 33))
Declares a foreign type transformation, similar to define-foreign-type
.
The value should be a list of two to four items, separated by the ;
character:
a C typename, a Scheme foreign type specifier and optional argument- and result-value
conversion procedures.
;;;; foreign type that converts to unicode (assumes 4-byte wchar_t): ; ; - Note: this is rather kludgy is only meant to demonstrate the `type' ; pseudo-declaration (require-extension srfi-4) (define mbstowcs (foreign-lambda int "mbstowcs" nonnull-u32vector c-string int)) (define (str->ustr str) (let* ([len (string-length str)] [us (make-u32vector (add1 len) 0)] ) (mbstowcs us str len) us) ) #>! __declare(type, "unicode;nonnull-u32vector;str->ustr") static void foo(unicode ws) { printf("\"%ls\"\n", ws); } <# (foo "this is a test!")
The parser understand the following grammar:
PROGRAM = PPCOMMAND | DECLARATION ";" PPCOMMAND = "#define" ID [TOKEN ...] | "#ifdef" ID | "#ifndef" ID | "#else" | "#endif" | "#undef" ID | "#error" TOKEN ... | "#include" INCLUDEFILE | "#pragma" TOKEN ... DECLARATION = FUNCTION | VARIABLE | ENUM | TYPEDEF | CLASS | CONSTANT | "struct" ID | "__declare" "(" PSEUDODECL "," <tokens> ")" INCLUDEFILE = "\"" ... "\"" | "<" ... ">" FUNCTION = {"__callback" | "__specialize" | "__discard"} [STORAGE] TYPE ID "(" TYPE [ID] "," ... ")" [CODE] | {"__callback" | "__specialize" | "__discard"} [STORAGE] TYPE ID "(" "void" ")" [CODE] VARIABLE = [STORAGE] TYPE ID ["=" INITDATA] STORAGE = "extern" | "static" | "volatile" | "inline" CONSTANT = "const" TYPE ID "=" INITDATA PSEUDODECL = "export_constants" | "prefix" | "substitute" | "abstract" | "type" | "scheme" | "rename" | "transform" | "full_specialization" | "destructor_name" | "class_finalizers" | "exception_handler" ENUM = "enum" "{" ID ["=" NUMBER] "," ... "}" TYPEDEF = "typedef" TYPE ["*" ...] ID TYPE = ["const"] BASICTYPE [("*" ... | "&" | "<" TYPE "," ... ">" | "(" "*" [ID] ")" "(" TYPE "," ... ")")] BASICTYPE = ["unsigned" | "signed"] "int" | ["unsigned" | "signed"] "char" | ["unsigned" | "signed"] "short" | ["unsigned" | "signed"] "long" | ["unsigned" | "signed"] "__byte" | "float" | "double" | "void" | "bool" | "__bool" | "__scheme_value" | "__fixnum" | "struct" ID | "union" ID | "enum" ID | ID CLASS = ["__abstract"] "class" ID [":" [QUALIFIER] ID "," ...] "{" MEMBER ... "}" MEMBER = [QUALIFIER ":"] ["virtual"] (MEMBERVARIABLE | CONSTRUCTOR | DESTRUCTOR | MEMBERFUNCTION) MEMBERVARIABLE = TYPE ID ["=" INITDATA] MEMBERFUNCTION = {"__callback" | "static" | "__specialize" | "__discard"} TYPE ID "(" TYPE [ID] "," ... ")" ["const"] ["=" "0"] [CODE] | {"__callback" | "static" | "__specialize" | "__discard"} TYPE ID "(" "void" ")" ["const"] ["=" "0"] [CODE] CONSTRUCTOR = ["__callback"] ["explicit"] ID "(" TYPE [ID] "," ... ")" [BASECONSTRUCTORS] [CODE] DESTRUCTOR = ["__callback"] "~" ID "(" ["void"] ")" [CODE] QUALIFIER = ("public" | "private" | "protected") NUMBER = <a C integer or floating-point number, in decimal, octal or hexadecimal notation> INITDATA = <everything up to end of chunk> BASECONSTRUCTORS = <everything up to end of chunk> CODE = <everything up to end of chunk>
The following table shows how argument-types are translated:
[unsigned] char
[unsigned] short
[unsigned] int
[unsigned] long
float
double
bool
__bool
__fixnum
__scheme_value
char *
signed char *
[signed] short *
[signed] int *
[signed] long *
unsigned char *
unsigned short *
unsigned int *
unsigned long *
float *
double *
CLASS *
TYPE *
TYPE
TYPE<T1, ...>
TYPE1 (*)(TYPE2, ...)
The following table shows how result-types are translated:
void
[unsigned] char
[unsigned] short
[unsigned] int
[unsigned] long
float
double
bool
__bool
__fixnum
__scheme_value
char *
CLASS *
TYPE *
TYPE
TYPE<T1, ...>
TYPE1 (*)(TYPE2, ...)
Foreign variable definitions for macros are not exported from the current compilation unit, but definitions for C variables and functions are.
foreign-parse
does not embed the text into
the generated C file, use foreign-declare
for that (or even better, use the #>! ... <#
syntax
which does both).
Functions with variable number of arguments are not supported.
Each C++ class defines a TinyCLOS class, which is a subclass of <c++-object>
. Instances of this class
contain a single slot named this
, which holds a pointer to a heap-allocated C++ instance.
The name of the TinyCLOS class is obtained by putting the C++ classname between angled brackets (<...>
).
TinyCLOS classes are not seen by C++ code.
The C++ constructor is invoked by the initialize
generic, which accepts as many arguments
as the constructor. If no constructor is defined, a default-constructor will be provided taking no arguments.
To allow creating class instances from pointers created in foreign code, the initialize
generic will optionally accept an arguments list of the form 'this POINTER
, where POINTER
is a foreign pointer object. This will create a TinyCLOS instance for the given C++ object.
To release the storage allocated for a C++ instance invoke the destroy
generic
(the name can be changed by using the destructor_name
pseudo declaration).
Static member functions are wrapped in a Scheme procedure named <class>::<member>
.
Member variables and non-public member functions are ignored.
Virtual member functions are not seen by C++ code. Overriding a virtual member function with a TinyCLOS method will not work when the member function is called by C++.
Operator functions and default arguments are not supported.
Exceptions must be explicitly handled by user code and may not be thrown beyond an invocation of C++ by Scheme code.
The following functions and macros are available for C code that invokes Scheme:
These macros return immediate Scheme data objects.
These functions allocate memory from
ptr
and initialize a fresh data object. The new data object is returned.ptr
should be the address of an allocation pointer created withC_alloc
.
Allocates memory from the C stack (
C_alloc
) and returns a pointer to it.words
should be the number of words needed for all data objects that are to be created in this function. Note that stack-allocated data objects have to be passed to Scheme callback functions, or they will not be seen by the garbage collector. This is really only usable for callback procedure invocations, make sure not to use it in normal code, because the allocated memory will be re-used after the foreign procedure returns. When invoking Scheme callback procedures a minor garbage collection is performed, so data allocated withC_alloc
will already have moved to a safe place.
These are macros that return the size in words needed for a data object of a given type.
These macros and functions can be used to convert Scheme data objects back to C data.
Return the number of elements and the type-bits of the non-immediate Scheme data object
x
.
This macro can be used to access slots of the non-immediate Scheme data object
x
.index
specifies the index of the slot to be fetched, starting at 0. Pairs have 2 slots, one for the car and one for the cdr. Vectors have one slot for each element.
Returns a pointer to the data-section of a non-immediate Scheme object.
A macro to build a Scheme object header from its bits and size parts.
Assign the Scheme value
val
to the location specified byslot
. If the value points to data inside the nursery (the first heap-generation), then the garbage collector will remember to handle the data appropriately. Assigning nursery-pointers directly will otherwise result in lost data.
Returns the global value of the variable with the name
symbol
.
Registers
n
variables at addressptrs
to be garbage collection roots. The locations should not contain pointers to data allocated in the nursery, only immediate values or pointers to heap-data are valid. Any assignment of potential nursery data into a root-array should be done viaC_mutate()
. The variables have to be initialized to sensible values before the next garbage collection starts (when in doubt, set all locations inptrs
toC_SCHEME_UNDEFINED
)C_gc_protect
may not called before the runtime system has been iniitalized (either byCHICKEN_initialize
,CHICKEN_run
orCHICKEN_invoke
.
Removes the last
n
registered variables from the set of root variables.
An example:
% cat foo.scm #> extern int callout(int, int, int); <# (define callout (foreign-callback-lambda int "callout" int int int)) (define-external (callin (scheme-object xyz)) int (print "This is 'callin': " xyz) 123) (print (callout 1 2 3)) % cat bar.c #include <stdio.h> #include "chicken.h" extern int callout(int, int, int); extern int callin(C_word x); int callout(int x, int y, int z) { C_word *ptr = C_alloc(C_SIZEOF_LIST(3)); C_word lst; printf("This is 'callout': %d, %d, %d\n", x, y, z); lst = C_list(&ptr, 3, C_fix(x), C_fix(y), C_fix(z)); return callin(lst); /* Note: `callin' will have GC'd the data in `ptr' */ } % chicken foo.scm -quiet % gcc foo.c bar.c -o foo `chicken-config -cflags -libs` % foo This is 'callout': 1, 2, 3 This is 'callin': (1 2 3) 123
Notes:
-nursery
option)
or when running the executable (using the -:s
runtime option).
call-with-current-continuation
and passed to C code can be invoked like any other Scheme procedure.
Extension libraries are extensions to the core functionality provided
by the basic CHICKEN system, to be built and installed separately.
The mechanism for loading compiled extensions is based on dynamically
loadable code and as such is only available on systems on which
loading compiled code at runtime is supported. Currently this are
most UNIX-compatible platforms that provide the libdl
functionality
like Linux, Solaris, BSD or Mac OS X. Windows with Cygwin is supported as well.
Note: Extension may also be normal applications or shell scripts.
To install an extension library, run the chicken-setup
program
with the extension name as argument. If the extension consists of a
single Scheme file, then it is compiled and installed in the extension
repository. If it is an archive containing addition files, then
the files are extracted and the contained setup script is
executed. This setup script is a normal Scheme source file, which
will be interpreted by chicken-setup
. The complete language supported
by csi
is available, and the library units
srfi-1 regex utils posix tcp
are loaded. Additional
libraries can of course be loaded at run-time.
The setup script should perform all necessary steps to build the
new library (or application). After a successful build, the extension
can be installed by invoking one of the procedures
install-extension
, install-program
or install-script
.
These procedures will copy a number of given files into the extension
repository or in the path where the CHICKEN executables are located (in the
case of executable programs or scripts). Additionally the list of
installed files, and user-defined metadata is stored in the repository.
Extensions can be created by creating an archive named EXTENSION.egg
containing all needed files plus a .setup
script in the root directory.
After chicken-setup
has extracted the files, the setup script will be
invoked. There are no additional constraints on the structure of the archive,
but the setup script has to be in the root path of the archive.
(install-extension ID FILELIST [INFOLIST])Installs extension library with the name
ID
. All files given in the list of stringsFILELIST
will be copied to the extension repository. The optional argumentINFOLIST
should be an association list that maps symbols to values, this list will be stored asID.setup
at the same location as the extension code. Currently the following properties are used:— property: syntax
(syntax)Marks the extension as syntax-only. No code is compiled, the extension is intended as a file containing macros to be loaded at compile/macro-expansion time.
— property: require-at-runtime
(require-at-runtime ID ...)Specifies extensions that should be loaded (via
require
) at runtime. This is mostly useful for syntax extensions that need additional support code at runtime.All other properties are currently ignored. The
FILELIST
argument may also be a single string.
(install-program ID FILELIST [INFOLIST])Similar to
install-extension
, but installs an executable program in the executable path (usually/usr/local/bin
.
(install-program ID FILELIST [INFOLIST])Similar to
install-program
, but additionally changes the file permissions of all files inFILELIST
to executable (for installing shell-scripts).
(run FORM ...)Runs the shell command
FORM
, which is wrapped in an implicitquasiquote
.
(make ((TARGET (DEPENDENT ...) COMMAND ...) ...) ARGUMENTS)A “make” macro that executes the expressions
COMMAND ...
, when any of the dependentsDEPENDENT ...
have changed, to buildTARGET
. This is the same as themake
extension, which is available separately. For more information, see make.
(patch WHICH REGEX SUBST)Replaces all occurrences of the regular expression
REGEX
with the stringSUBST
, in the file given inWHICH
. IfWHICH
is a string, the file will be patched and overwritten. IfWHICH
is a list of the formOLD NEW
, then a different file namedNEW
will be generated.
The simplest case is a single file that does not export any syntax. For example
;;;; hello.scm (define (hello name) (print "Hello, " name " !") )
After entering
$ chicken-setup hello
at the shell prompt, the file hello.scm
will be compiled into a dynamically loadable library,
with the default compiler options -optimize-level 2 -debug-level 0 -shared
. If the
compilation succeeds, hello.so
will be stored in the repository, together with a file named
hello.setup
(not to be confused with a setup script - this .setup
file just contains
an a-list with metadata).
Use it like any other CHICKEN extension:
$ csi -quiet #;> (require-extension hello) ; loading /usr/local/lib/chicken/hello.so ... #;> (hello "me") Hello, me! #;>
For more elaborate build operations, when installing applications or scripts, or when
additional metadata should be stored for an extension, a setup
script is required
and the script and all additional files should be packaged in a gzipped tar
archive.
Here we create a simple application:
;;;; hello2.scm (require-extension extras) ; needed for `printf' (print "Hello, ") (for-each (lambda (x) (printf "~A " x)) (command-line-arguments)) (print "!")
We also need a setup script:
;;;; hello2.setup (run (csc hello2.scm)) ; compile `hello2' (install-program 'hello2 "hello2") ; name of the extension and files to be installed
To use it, just run chicken-setup
in the same directory:
$ chicken-setup hello2
Now the program hello2
will be installed in the same location as the other CHICKEN
tools (like chicken
, csi
, etc.), which will normally be /usr/local/bin
.
Note that you need write-permissions for those locations.
Uninstallation is just as easy:
$ chicken-setup -uninstall hello2
chicken-setup
provides a make
tool, so building operations can be of
arbitrary complexity. When running chicken-setup
with an argument NAME
,
for which no associated file NAME.setup
, NAME.egg
or NAME.scm
exists will ask you to download the extension via HTTP from the default URL
http://www.call-with-current-continuation.org/eggs
. You can use the
-host
option to specify an alternative source location.
Finally a somewhat more complex example: We want to package a syntax extension with additional support code that is to be loaded at run-time of any Scheme code that uses that extension. We create a “glass” lambda, a procedure with free variables that can be manipulated from outside:
;;;; glass.scm (define-macro (glass-lambda llist vars . body) ;; Low-level macros are fun! (let ([lvar (gensym)] [svar (gensym)] [x (gensym)] [y (gensym)] [yn (gensym)] ) `(let ,(map (lambda (v) (list v #f)) vars) (define (,svar ,x . ,y) (let* ([,yn (pair? ,y)] [,y (and ,yn (car ,y))] ) (case ,x ,@(map (lambda (v) `([,v] (if ,yn (set! ,v ,y) ,v) ) ) vars) (else (error "variable not found" ,x)) ) ) ) (define ,lvar (lambda ,llist ,@body)) (extend-procedure ,lvar ,svar) ) ) )
Here some support code that needs to be loaded at runtime:
;;;; glass-support.scm (require-extension lolevel) (define glass-lambda-accessor procedure-data) (define (glass-lambda-ref gl v) ((procedure-data gl) v)) (define (glass-lambda-set! gl v x) ((procedure-data gl) v x))
The setup script looks like this:
(run (csc -s -O2 -d0 glass-support.scm)) (install-extension 'glass '("glass.scm" "glass-support.so") '((syntax) (require-at-runtime glass-support)) )
The invocation of install-extension
provides the files that
are to be copied into the extension repository, and a metadata list that
specifies that the extension glass
is a syntax extension and that,
if it is declared to be used by other code (either with the require-extension
or require-for-syntax
form), then client code should perform an implicit
(require 'glass-support)
at startup.
This can be conveniently packaged as an “egg”:
$ tar cfz glass.egg glass.setup glass.scm glass-support.scm
And now we use it:
$ csi -quiet #;> (require-extension glass) ; loading /usr/local/lib/chicken/glass.scm ... ; loading /usr/local/lib/chicken/glass-support.so ... #;> (define foo (glass-lambda (x) (y) (+ x y))) #;> (glass-lambda-set! foo 'y 99) #;> (foo 33) 132
chicken-setup
referenceAvailable options:
-help
Show usage information and exit.
-version
Display version and exit.
-repository [PATHNAME]
When used without an argument, the path of the extension repository is displayed on standard
output. When given an argument, the repository pathname (and the repository-path
parameter)
will be set to PATHNAME
for all subsequent operations. The default repository path is
the installation library directory (usually /usr/local/lib/chicken
), or (if set) the
directory given in the environment variable CHICKEN_REPOSITORY
.
-program-path [PATHNAME]
When used without an argument, the path for executables is displayed on standard output.
When given an argument, the program path for installing executables and scripts will be set to
PATHNAME
for all subsequent operations.
-host HOSTNAME[:PORT]
Specifies alternative host for downloading extensions, optionally with a TCP port number (which
defaults to 80).
-uninstall EXTENSION
Removes all files that were installed for EXTENSION
from the file-system, together
with any metadata that has been stored.
-list
List all installed extensions and exit.
-run FILENAME
Load and execute given file.
-script FILENAME
Executes the given Scheme source file with all remaining arguments and exit. The “she-bang”
shell script header is recognized, so you can write Scheme scripts that use chicken-setup
just as with csi
.
-verbose
Display additional debug information.
-keep
Keep temporary files and directories.
Note that the options are processed exactly in the order in which they appear in the command-line.
In addition to library units the following files are provided. Use them
by including the file in your code with the include
special form.
srfi-13-syntax.scm
This file provides the let-string-start+end
syntax defined
in SRFI-13. See Unit srfi-13.
chicken-highlevel-macros.scm
This file contains highlevel (syntax-case
) macro definitions
for all non-standard macros CHICKEN provides. Normally you don't directly use
this file, since it is loaded automatically by the compiler or interpreter,
when the -hygienic
option is used.
If you intend to make highlevel macros (R5RS and/or syntax-case
) available
at run-time (for example, for evaluating code at runtime that contains highlevel macros),
declare the syntax-case
unit as used and install the macro system by hand,
as in this example:
(require-extension syntax-case) (install-highlevel-macro-system)
(This is basically what the -hygienic-at-run-time
option does, but this
procedure gives you a little more control.)
(install-highlevel-macro-system FEATURE ...)Installs the highlevel (R5RS /
syntax-case
) macro system in the running program.FEATURE
should be a symbol and selects the amount of non-standard macros being provided. Possible features are:
r5rs
The R5RS standard derived syntax, and only those.
srfi-0
SRFI-0 (
cond-expand
)extensions
R5RS standard derived syntax and all non-standard extension provided in CHICKEN
If no feature is give,
'r5rs
is assumed.
chicken-more-macros.scm
This file contains the definitions of all non-standard syntax forms. You normally don't use this file directly.
chicken-ffi-macros.scm
This file contains the definitions of macros for interfacing to foreign code, and the definitions contained in this file are automatically made available in compiled code.
chicken-entry-points.scm
This file contains the definition of the macros define-entry-point
and define-embedded
. See the section “Entry points” earlier in this manual.
chicken-default-entry-points.scm
This file contains boilerplate entry point definitions. See the section
“Entry points”. This file automatically includes entry-points.scm
.
test-infrastructure.scm
This file provides a macro based unit testing facility based upon expectations concerning evaluations of expressions. These functions return tagged lists which contain the results of the test package, test case, or expectations evaluated(there are a few other types of results dealing with the gloss, todo, and skip macros detailed below). These result lists are wired together during evaluation to form a large hierarchical tree in memory. This result tree is then passed to either user defined functions which traverse the tree manipulating it in any way desired, or passed to a supplied (read: defined already in test-infrastructure.scm) function which manipulates it in a simple way usually producing human readable or html generated output. API functions to deal with the result types are supplied and the representation of the result is black boxed to the user. It is a violation of encapsulation to inspect the representation directly, and it may change unpredictably in the future.
This macro will evaluate in a left to right fashion the clauses inside it. Clauses can only be certain things, detailed below. All of the clauses are executed, except of course if you bail out of the test package with the escape procedure mechanism. Test packages may nest indefinitely.
(test-package MESSAGE DESTNAME TERMNAME CLAUSES) (test-package MESSAGE DESTNAME TERMNAME (BINDINGS) CLAUSES) (test-package MESSAGE DESTNAME TERMNAME (warn MESSAGE) CLAUSES) (test-package MESSAGE DESTNAME TERMNAME (warn MESSAGE) (BINDINGS) CLAUSES)
MESSAGE
can be any scheme object, though usually it is a string.DESTNAME
is an unquoted symbol for an automatic destructor object that gets called when the test package completes for any reason. This symbol is bound to a destructor object and is available to you in the CLAUSES section of the test package. See below for the description of the destructor object interface.TERMNAME
is an unquoted symbol for an escape procedure available in the body of the test package, usually, this escape procedure is passed to(terminate ...)
which calls it for you and performs other tasks. It is not recommended to call the escape procedure directly.(warn MESSAGE)
allows you to specify a warning object, usually a string, that gets associated with the test package. Thewarn
function name is actually a syntax reserved word in the macro.BINDINGS
are let-style bindings that you may create and exist in the lexical scope of the test package.CLAUSES
are uses of(test-case ...)
macros along with(gloss ...)
,(todo ...)
,(skip ...)
, and(terminate ...)
macros. While you may use the(expect-* ...)
style macros directly in a test package, doing so is not recommended. If the expectation fails, the test package macro will continue evaluating until all clauses are evaluated or the escape procedure mechanism is activated. This is different than a test-case macro where upon discovery of a failed expectation, evaluation stops immediately.
This macro will evaluate in a left to right fashion the clauses inside it stopping at the first failed expectation. Clauses can only be certain things as detailed below. You may also stop the execution of expectations if you bail out of the test case with the escape procedure mechanism. Test cases may NOT nest.
(test-case MESSAGE DESTNAME TERMNAME CLAUSES) (test-case MESSAGE DESTNAME TERMNAME (BINDINGS) CLAUSES) (test-case MESSAGE DESTNAME TERMNAME (warn MESSAGE) CLAUSES) (test-case MESSAGE DESTNAME TERMNAME (warn MESSAGE) (BINDINGS) CLAUSES)
MESSAGE
can be any scheme object, though usually it is a string.DESTNAME
is an unquoted symbol for an automatic destructor object that gets called when the test case completes for any reason. This symbol is bound to a destructor object and is available to you in the CLAUSES section of the test package. See below for the description of the destructor object interface.TERMNAME
is an unquoted symbol for an escape procedure available in the body of the test case, usually, this escape procedure is passed to(terminate ...)
which calls it for you and performs other tasks. It is not recommended to call the escape procedure directly.(warn MESSAGE)
allows you to specify a warning object, usually a string, that gets associated with the test case. Thewarn
function name is actually a syntax reserved word in the macro.BINDINGS
are let-style bindings that you may create and exist in the lexical scope of the test case.CLAUSES
are uses of(expect-* ...)
macros along with(gloss ...)
,(todo ...)
,(skip ...)
, and(terminate ...)
macros. It is important to note that upon discovery of a failed expectation, the test case stops its evaluation and returns with the previous successful, and including the failed, expectations.
An expectation at its core simply evaluates its arguments and check to see if it matches the expectation. The positive or negative result is encapsulated, along with other things such as the unevaluated expressions being checked and some messages supplied with each expectation into a particular type of black box object that one can query with the appropriate API calls(detailed below).
Expectations all have a descriptive message that can be bound to them, along with an optional warning syntax detailed below. A design decision was made to supply expectation macros for the usual types of expectations a user needs because this reduced the abstractness of an expectation into something more manageable. In a future release however, I will supply a special expectation macro where you may supply any predicate you wish along with a “type tag” of the predicate.
(expect-zero MESSAGE CLAUSE) (expect-zero MESSAGE (warn MESSAGE) CLAUSE)
- This expectation checks to see if the evaluated expression passed to it is numerically equal to the exact integer zero.
MESSAGE
can be any scheme object, though usually it is a string.(warn MESSAGE)
allows you to specify a warning object, usually a string, that gets associated with the expectation. Thewarn
function name is actually a syntax reserved word in the macro.CLAUSE
is a single expression which should return a exact or inexact integer.
(expect-nonzero MESSAGE CLAUSE) (expect-nonzero MESSAGE (warn MESSAGE) CLAUSE)
- This expectation checks to see if the evaluated expression passed to it is numerically not equal to the exact integer zero.
MESSAGE
can be any scheme object, though usually it is a string.(warn MESSAGE)
allows you to specify a warning object, usually a string, that gets associated with the expectation. Thewarn
function name is actually a syntax reserved word in the macro.CLAUSE
is a single expression which should return an exact or inexact integer.
(expect-true MESSAGE CLAUSE) (expect-true MESSAGE (warn MESSAGE) CLAUSE)
- This expectation checks to see if the evaluated expression passed to it is the value #t.
MESSAGE
can be any scheme object, though usually it is a string.(warn MESSAGE)
allows you to specify a warning object, usually a string, that gets associated with the expectation. Thewarn
function name is actually a syntax reserved word in the macro.CLAUSE
is a single expression which should return #t.
(expect-false MESSAGE CLAUSE) (expect-false MESSAGE (warn MESSAGE) CLAUSE)
- This expectation checks to see if the evaluated expression passed to it is the value #f.
MESSAGE
can be any scheme object, though usually it is a string.(warn MESSAGE)
allows you to specify a warning object, usually a string, that gets associated with the expectation. Thewarn
function name is actually a syntax reserved word in the macro.CLAUSE
is a single expression which should return #t.
(expect-eq? MESSAGE EXPECTED CLAUSE) (expect-eq? MESSAGE (warn MESSAGE) EXPECTED CLAUSE)
- This expectation checks to see if
(eq? EXPECTED CLAUSE)
is true.MESSAGE
can be any scheme object, though usually it is a string.(warn MESSAGE)
allows you to specify a warning object, usually a string, that gets associated with the expectation. Thewarn
function name is actually a syntax reserved word in the macro.EXPECTED
is a single expression which is evaluated and represents the value theCLAUSE
must be eq? to in order for this expectation to return a positive result.CLAUSE
is a single expression which, when evaluated must return an object where an eq? of this result and theEXPECTED
expression is #t.- The result object this macro produce shall contain the unevaluated
CLAUSE
expression as a field, but not an unevaluatedEXPECTED
expression.
(expect-eqv? MESSAGE EXPECTED CLAUSE) (expect-eqv? MESSAGE (warn MESSAGE) EXPECTED CLAUSE)
- This expectation checks to see if
(eqv? EXPECTED CLAUSE)
is true.MESSAGE
can be any scheme object, though usually it is a string.(warn MESSAGE)
allows you to specify a warning object, usually a string, that gets associated with the expectation. Thewarn
function name is actually a syntax reserved word in the macro.EXPECTED
is a single expression which is evaluated and represents the value theCLAUSE
must be eqv? to in order for this expectation to return a positive result.CLAUSE
is a single expression which, when evaluated must return an object where an eqv? of this result and theEXPECTED
expression is #t.- The result object this macro produce shall contain the unevaluated
CLAUSE
expression as a field, but not an unevaluatedEXPECTED
expression.
(expect-equal? MESSAGE EXPECTED CLAUSE) (expect-equal? MESSAGE (warn MESSAGE) EXPECTED CLAUSE)
- This expectation checks to see if
(equal? EXPECTED CLAUSE)
is true.MESSAGE
can be any scheme object, though usually it is a string.(warn MESSAGE)
allows you to specify a warning object, usually a string, that gets associated with the expectation. Thewarn
function name is actually a syntax reserved word in the macro.EXPECTED
is a single expression which is evaluated and represents the value theCLAUSE
must be equal? to in order for this expectation to return a positive result.CLAUSE
is a single expression which, when evaluated must return an object where an equal? of this result and theEXPECTED
expression is #t.- The result object this macro produce shall contain the unevaluated
CLAUSE
expression as a field, but not an unevaluatedEXPECTED
expression.
(expect-near? MESSAGE EXPECTED TOL CLAUSE) (expect-near? MESSAGE (warn MESSAGE) EXPECTED TOL CLAUSE)
- This expectation checks to see if
(< (abs (- EXPECTED CLAUSE)) TOL)))
is true.MESSAGE
can be any scheme object, though usually it is a string.(warn MESSAGE)
allows you to specify a warning object, usually a string, that gets associated with the expectation. Thewarn
function name is actually a syntax reserved word in the macro.EXPECTED
is a single expression which is evaluated and represents the value theCLAUSE
must be “near” to in order for this expectation to return a positive result.CLAUSE
is a single expression which should return an inexact or exact number.TOL
is a single expression which, when evaluated must return a tolerance value(usually a small inexact number like .0001).- The result object this macro produce shall contain the unevaluated
CLAUSE
expression as a field, but not the unevaluatedEXPECTED
orTOL
expression.
(expect-positive MESSAGE CLAUSE) (expect-positive MESSAGE (warn MESSAGE) CLAUSE)
- This expectation checks to see if the evaluated expression passed to it is a positive value greater than zero.
MESSAGE
can be any scheme object, though usually it is a string.(warn MESSAGE)
allows you to specify a warning object, usually a string, that gets associated with the expectation. Thewarn
function name is actually a syntax reserved word in the macro.CLAUSE
is a single expression which should return an inexact or exact number.
(expect-negative MESSAGE CLAUSE) (expect-negative MESSAGE (warn MESSAGE) CLAUSE)
- This expectation checks to see if the evaluated expression passed to it is a negative value less than zero.
MESSAGE
can be any scheme object, though usually it is a string.(warn MESSAGE)
allows you to specify a warning object, usually a string, that gets associated with the expectation. Thewarn
function name is actually a syntax reserved word in the macro.CLAUSE
is a single expression which should return an inexact or exact number.
Expectations, test cases, test packages, and helper macros(gloss,
todo, etc
) all return an object that contains the results and other various
aspects of the action performed which ultimately get wired together to
form the result tree. This collection of functions forming the rest of the
test infrastructure API allows manipulation of these results in an abstracted
way as to allow changing of the representation in the future.
If any of these API functions, except test-package-result?, are passed something that isn't a test package result object, they will return 'not-a-test-package-result.
(test-package-result? RESULT)If
RESULT
is a result object from the invocation of a test package macro, then this function will return #t. Otherwise, it will return #f.
(test-package-result-result-ref RESULT)Returns the boolean result associated with the test package
RESULT
object.
(test-package-result-message-ref RESULT)Returns the message object associated with the test package
RESULT
object.
(test-package-result-exps-ref RESULT)Returns the list of result objects associated with the test package
RESULT
object.
(test-package-result-warning? RESULT)If a warning had been attached to this test package, this function will return #t, otherwise it will be #f.
(test-package-result-warning-ref RESULT)If a warning had been attached to this test package, this function will return the warning object supplied by the user, otherwise it shall return '().
If any of these API functions, except test-case-result?, are passed something that isn't a test case result object, they will return 'not-a-test-case-result.
(test-case-result? RESULT)If
RESULT
is a result object from the invocation of a test case macro, then this function will return #t. Otherwise, it will return #f.
(test-case-result-result-ref RESULT)Returns the boolean result associated with the test case
RESULT
object.
(test-case-result-message-ref RESULT)Returns the message object associated with the test case
RESULT
object.
(test-case-result-expectations-ref RESULT)Returns the list of expctation result objects associated with the test case
RESULT
object.
(test-case-result-warning? RESULT)If a warning had been attached to this test case, this function will return #t, otherwise it will be #f.
(test-case-result-warning-ref RESULT)If a warning had been attached to this test case, this function will return the warning object supplied by the user, otherwise it shall return '().
These expectations all take the form of passing a single expression to them to see if they match some a priori expectation. If any of these API functions, except expect-result?, are passed something that isn't a single clause style expectation result object, they will return 'not-an-expect-result.
(expect-result? RESULT)If
RESULT
is a single clause style result object from the invocation of an expectation macro, then this function will return #t. Otherwise, it will return #f.
(expect-result-result-ref RESULT)Returns the boolean result associated with the single clause style expectation
RESULT
object.
(expect-result-specific-ref RESULT)This retrieves the “specific” field of a particular single clause style expectation. For example, if you had a result object from an invocation of a
(expect-zero? "foobar" (- 1 1))
expectation, then the “specific” field of the expectation result object will be the string "zero". Here is a table describing what the “specific” fields are for each kind of single clause style expectation:
Single Clause Style Expectation Associated Specific String expect-zero "zero" expect-nonzero "nonzero" expect-true "true" expect-false "false" expect-positive "positive" expect-negative "negative"
(expect-result-message-ref RESULT)Returns the message object associated with the single clause style expectation
RESULT
object.
(expect-result-unevaled-ref RESULT)Returns the unevaluated expression supplied to a single clause style expectation macro.
(expect-result-evaled-ref RESULT)Returns the evaluated expression supplied to a single clause style expectation macro.
(expect-result-warning? RESULT)If a warning had been attached to this expectation, this function will return #t, otherwise it will be #f.
(expect-result-warning-ref RESULT)If a warning had been attached to this expectation, this function will return the warning object supplied by the user, otherwise it shall return '().
These expectations all take the form of passing a two expressions, the “left hand side” and the “right hand side” to them to see if they match some a priori equivalence. The left hand side is that which you expect the right hand side to be equivalent. If any of these API functions, except expect-equivalence-result?, are passed something that isn't a single clause style expectation result object, they will return 'not-an-expect-equivalence-result.
(expect-equivalence-result? RESULT)If
RESULT
is a comparison style result object from the invocation of an expectation macro, then this function will return #t. Otherwise, it will return #f.
(expect-equivalence-result-result-ref RESULT)Returns the boolean result associated with the comparison style expectation
RESULT
object.
(expect-equivalence-result-specific-ref RESULT)This retrieves the “specific” field of a particular equivalence style expectation. For example, if you had a result object from an invocation of a
(expect-equal? "foobar" 0 (- 1 1))
expectation, then the “specific” field of the expectation result object will be the string "equal". Here is a table describing what the “specific” fields are for each kind of equivalence style expectation:
Equivalence Style Expectation Associated Specific String expect-eq "eq" expect-eqv "eqv" expect-equal "equal"
(expect-equivalence-result-message-ref RESULT)Returns the message object associated with the equivalence style expectation
RESULT
object.
(expect-equivalence-result-lhs-evaled-ref RESULT)Returns the evaluated “left hand side” expression supplied to an equivalence style expectation.
(expect-equivalence-result-rhs-unevaled-ref RESULT)Returns the unevaluated “right hand side” expression supplied to an equivalence style expectation.
(expect-equivalence-result-rhs-evaled-ref RESULT)Returns the evaluated “right hand side” expression supplied to an equivalence style expectation.
(expect-equivalence-result-warning? RESULT)If a warning had been attached to this expectation, this function will return #t, otherwise it will be #f.
(expect-equivalence-result-warning-ref RESULT)If a warning had been attached to this expectation, this function will return the warning object supplied by the user, otherwise it shall return '().
This is a specialized expectation which accepts three expressions and checks to see if the “right hand side” is within a “tolerance” of the “left hand side”. There is only one expectation in the tolerance style currently. If any of these API functions, except expect-tolerance-result?, are passed something that isn't a tolerance style expectation result object, they will return 'not-an-expect-tolerance-result.
(expect-tolerance-result? RESULT)If
RESULT
is a tolerance style result object from the invocation of an expectation macro, then this function will return #t. Otherwise, it will return #f.
(expect-tolerance-result-result-ref RESULT)Returns the boolean result associated with the tolerance style expectation
RESULT
object.
(expect-tolerance-result-specific-ref RESULT)This retrieves the “specific” field of a particular tolerance style expectation. For example, if you had a result object from an invocation of a
(expect-near? "foobar" 100 .01 100.001)
expectation, then the “specific” field of the expectation result object will be the string "near". Here is a table describing what the “specific” fields are for each kind of tolerance style expectation:
Tolerance Style Expectation Associated Specific String expect-near "near"
(expect-tolerance-result-message-ref RESULT)Returns the message object associated with a tolerance style expectation
RESULT
object.
(expect-tolerance-result-lhs-evaled-ref RESULT)Returns the evaluated “left hand side” expression supplied to a tolerance style expectation.
(expect-tolerance-result-lhs-tol-evaled-ref RESULT)Returns the evaluated “tolerance” expression supplied to a tolerance style expectation.
(expect-tolerance-result-rhs-unevaled-ref RESULT)Returns the unevaluated “right hand side” expression supplied to a tolerance style expectation.
(expect-tolerance-result-rhs-evaled-ref RESULT)Returns the evaluated “right hand side” expression supplied to a tolerance style expectation.
(expect-tolerance-result-warning? RESULT)If a warning had been attached to this expectation, this function will return #t, otherwise it will be #f.
(expect-tolerance-result-warning-ref RESULT)If a warning had been attached to this expectation, this function will return the warning object supplied by the user, otherwise it shall return '().
These upcoming macros and functions allow the author of the test suite to better control both the execution flow of the test suite and “decoration” of the test suite with important information like things yet to do, or just plain documentation.
When executing in a test package or a test case, one might discover some catastrophic failure of such proportions that it is utterly impossible to continue executing the test case or test package. When that happens you can use the termination facility to exit the test case or test package. Of course, no more expressions will be evaluated in the scope of the termination. It is recommended that you use this method of terminating the test case or test package evaluation since it wraps some contextual information up into the termination result so you can figure out what happened(and where) later when analyzing the result tree.
When using the manipulation API for a terminate result, if you pass a result to one of these function that is not a terminate result, it will return 'not-a-terminate-result.
(terminate TERMFUNC MESSAGE)
- This is the recommended termination method for a test case or a test package.
TERMFUNC
is the name of the termination procedure that you specified in a test case or test package. You may pass any test package or test case termination function available to you in the lexical scope in which you call this function. The termination will take effect in the scope of the created termination function.MESSAGE
can be any scheme object, though usually it is a string.
(terminate-result? RESULT)If
RESULT
is a termination result object from the invocation of a termination function, then this function will return #t. Otherwise, it will return #f.
(terminate-result-result-ref RESULT)Returns the boolean result associated with the termination function
RESULT
object. This is currently hard coded to be #f.
(terminate-result-scope-ref RESULT)The “scope” of the termination result is exactly the
MESSAGE
parameter supplied to the test case or test package associated with theTERMFUNC
.
(terminate-result-container-ref RESULT)The “container” of the termination result is going to be either 'test-package or 'test-case depending upon which the
TERMFUNC
was associated.
(terminate-result-message-ref RESULT)Returns the message object associated with the termination
RESULT
object.
The destructor object allows for you to create helper functions which clean up for you usually in case of aborting of a test case or package. For example, suppose you are testing whether or not file writing to a file works correctly in a test case, so, you'd perform an expectation to open the file, and then queue a function in the destructor to remove the file, and then perform the expectation of the write. If the write(or subsequent) expectation fails, then the test case will automatically invoke the helper cleanup function specified in the destructor object that removes the file.
NOTE: This API is still a little experimental in the sense that eventually he destructor object should return a typed result that contains the success of the individual destructor calls. But for now, it is functional for what it does. Also, be VERY CAREFUL that you specify the arguments to these API calls correctly since due to lambda functions not being comparable, this API cannot garuantee that a true destructor object name had been passed to it. So if you call one of the following API calls incorrectly, the behavior will be undefined.
(destructor-atexit! DESTNAME FUNC ARGS ...)This will insert a promise to calculate the
FUNC
with the suppliedARGS ...
into a queue in theDESTNAME
destructor object. Multiple invocations of this API call will continue to queue up(FUNC ARGS ...)
promises indefinitely. This function returns a special ignore type that is ignored by the test infrastructure system.
(destructor-activate! DESTNAME)This function will call, in order of queueing, all the promises embedded into this destructor object, and then delete the queue. This function is ALWAYS called at the completion of a test package or test case; so be careful that the destructor object doesn't contain anything harmful. However, you may call it yourself and if you do, it will execute all of the queued promises and then
clear
itself. This function returns a special ignore type that is ignored by the test infrastructure system.
(destructor-clear! DESTNAME)This function completely removes all of the promises associated with the destructor object
DESTNAME
. This function returns a special ignore type that is ignored by the test infrastructure system.
(destructor-dump DESTNAME)This function, mostly used for debugging purposes, prints out a simple representation of the queued atexit functions to the current port. This function returns a special ignore type that is ignored by the test infrastructure system.
The purpose of the todo API is to allow the author of a test suite the ability to record into the result tree for later analysis that something still needs to be done. This way you can count/manipulate this information at a later date. Todo macro invocations can occur inside of test cases or test packages.
(todo MESSAGE) (todo (warn WARNING) MESSAGE)
MESSAGE
can be any scheme object, though usually it is a string.(warn WARNING)
allows you to specify a warning object, usually a string, that gets associated with the todo. Thewarn
function name is actually a syntax reserved word in the macro.
(todo-result? RESULT)If
RESULT
is a todo result object from the invocation of a todo macro, then this function will return #t. Otherwise, it will return #f.
(todo-result-message-ref RESULT)Returns the message object associated with the todo
RESULT
object.
(todo-result-warning? RESULT)If a warning had been attached to this todo, this function will return #t, otherwise it will be #f.
(todo-result-warning-ref RESULT)If a warning had been attached to this todo, this function will return the warning object supplied by the user, otherwise it shall return '().
The purpose of the gloss API is to allow the author of a test suite the ability to record messages into the result tree purely for documentation purposes. Gloss macro invocations can occur inside of test cases or test packages.
(gloss MESSAGE) (gloss (warn WARNING) MESSAGE)
MESSAGE
can be any scheme object, though usually it is a string.(warn WARNING)
allows you to specify a warning object, usually a string, that gets associated with the gloss. Thewarn
function name is actually a syntax reserved word in the macro.
(gloss-result? RESULT)If
RESULT
is a gloss result object from the invocation of the gloss macro, then this function will return #t. Otherwise, it will return #f.
(gloss-result-message-ref RESULT)Returns the message object associated with the gloss
RESULT
object.
(gloss-result-warning? RESULT)If a warning had been attached to this gloss, this function will return #t, otherwise it will be #f.
(gloss-result-warning-ref RESULT)If a warning had been attached to this gloss, this function will return the warning object supplied by the user, otherwise it shall return '().
The purpose of the skip API is to allow the author of a test suite to completely skip evaluation of a set of expresssions. Skip macro invocations can occur inside of test cases or test packages.
(skip MESSAGE CLAUSES) (skip (warn WARNING) MESSAGE CLAUSES)
MESSAGE
can be any scheme object, though usually it is a string.(warn WARNING)
allows you to specify a warning object, usually a string, that gets associated with the gloss. Thewarn
function name is actually a syntax reserved word in the macro.CLAUSES
can be more than one expression(as in a lambda form) that does NOT get evaluated at any time.
(skip-result? RESULT)If
RESULT
is a skip result object from the invocation of the skip macro, then this function will return #t. Otherwise, it will return #f.
(skip-result-message-ref RESULT)Returns the message object associated with the skip
RESULT
object. Hopefully, it was stated why this set of clauses had been skipped.
(skip-result-warning? RESULT)If a warning had been attached to this skip, this function will return #t, otherwise it will be #f.
(skip-result-warning-ref RESULT)If a warning had been attached to this skip, this function will return the warning object supplied by the user, otherwise it shall return '().
This section of the API just contains a single macro currently since
it is considered a little experimental for now. The side effecting
evaluates all of its arguments as in a (begin ...)
form, it
returns a result that is completely ignored by the system and unavailable
to the output analysis code.
(side-effect CLAUSES)This macro expands into a begin form the clauses in order and when it finishes evaluating them, returns a result that is silently ignored by the testing infrastructure system. Usually this is used in conjunction with
(set! ...)
or with complicated situations where a lot of setup work must happen for an expectation to be performed.
This section contains a few functions whose purpose is to simplify certain kinds of manipulations of result objects.
(*-result? RESULTOBJ)This function will return #t of
RESULTOBJ
is any kind of an evaluated result object. Otherwise, it shall return #f.
(*-result-ref RESULTOBJ)This function will return the result of any kind of
RESULTOBJ
passed to it if it is indeed a true result object. Otherwise, it shall emit an error to the current port, and return #f.
(all-testpackage-results-true? RESULTLIST)This function takes the result of a call to
(test-package-result-result-ref PACKAGERESULTOBJ)
and returns #t if every single contained result in that list had been true, or #f otherwise.
(all-testcase-expectations-true? RESULTLIST)This function takes the result of a call to
(test-case-result-result-ref CASERESULTOBJ)
and returns #t if every single contained result in that list had been true, or #f otherwise.
Once a result tree has been evaluated and constructed in memory, what do you do with it? Well, you can do anything you want with it if you choose to write the analysis or output generation functions and pass it the evaluated result tree, and this is, in fact, encouraged. However, usually you just want to print out the tree in a human readable format so you can check things before the serious analysis code gets written. So, to save work for the test suite designer, a tiny API has been written to produce human readable output given a tree of results rooted in a single test package. Of course the single test package may have many other test packages and test cases embedded within it.
(printnl CLAUSES)This function will print all of the evaluated
CLAUSES
in order with a newline at the end of it.
(printinl INDENT CLAUSES)This function will
INDENT
a number of spaces and then print all of the evaluatedCLAUSES
in order with a newline at the end of it.
(output-style-human RESULTTREE)This function will print out a human readable rendering of the
RESULTTREE
and return the toplevel package result.
This section contains some simple examples of how to author test suites.
Here is a simple example:
(let ((result ;; output-style-human function requires a single test package ;; to encapsulate everything. (test-package "Arithmetic Operators" pd pe (test-case "Testing '+'" d e (expect-equal "Adding two positive numbers" 2 (+ 1 1)) (expect-equal "Adding two negative numbers" -2 (+ -1 -1)) (expect-zero "Adding positive and negative" (+ -1 1))) (test-case "Testing '-'" d e (expect-zero "Subtracting two positive numbers" (- 1 1)) (expect-zero "Subtracting two negative numbers" (- -1 -1)) (expect-equal "Subtracting positive and negative" -2 (- -1 1)))))) (output-style-human result))
The above example, when evaluated, will produce some human readable output
and the a #t value as the result of the top level package. The result
variable contains the tree of evaluated expectations, test cases, and the
package arranged in a hierarchy extremely similar to the nesting of the
above macros. If you desire to manipulate the result tree yourself, you
may use the various APIs to manipulate the various results. Please see the
implementation of (output-style-human ...)
(it isn't large) in the
test-infrastructure.scm file to see an example of this.
The variables: pe, e
are the escape functions you may use with the
(terminate ...)
function call if you wish to abort the above code
somewhere.
The variables: pd, d
allow use of a "destructor" object which allows
you to run side effecting functions at the "finishing" point of the evaluation
of the test case or test package. These functions are run no matter if the code
succeeded correctly or not, so be careful to manage the destructor object
carefully so you don't perform unwanted side effects. The names of the
destructor objects you supply are lexically scoped in the bodies of the
test case or test package.
Now, here is some example output that (output-style-human ...)
might
generate with the above testing code:
Begin Package: Arithmetic Operators Begin Test Case: Testing '+' Begin Expectation: Adding two positive numbers Expect equal Expected Value: 2 Unevaluated: (+ 1 1) Evaluated: 2 Result: #t End Expectation: Adding two positive numbers Begin Expectation: Adding two negative numbers Expect equal Expected Value: -2 Unevaluated: (+ -1 -1) Evaluated: -2 Result: #t End Expectation: Adding two negative numbers Begin Expectation: Adding positive and negative Expect zero Unevaluated: (+ -1 1) Evaluated: 0 Result: #t End Expectation: Adding positive and negative Result: #t End Test Case: Testing '+' Begin Test Case: Testing '-' Begin Expectation: Subtracting two positive numbers Expect zero Unevaluated: (- 1 1) Evaluated: 0 Result: #t End Expectation: Subtracting two positive numbers Begin Expectation: Subtracting two negative numbers Expect zero Unevaluated: (- -1 -1) Evaluated: 0 Result: #t End Expectation: Subtracting two negative numbers Begin Expectation: Subtracting positive and negative Expect equal Expected Value: -2 Unevaluated: (- -1 1) Evaluated: -2 Result: #t End Expectation: Subtracting positive and negative Result: #t End Test Case: Testing '-' Result: #t End Package: Arithmetic Operators #t
There exist two different kinds of data objects in the CHICKEN system: immediate and non-immediate objects. Immediate objects are represented by a tagged machine word, which is usually of 32 bits length (64 bits on 64-bit architectures). The immediate objects come in four different flavors:
C_CHARACTER_BITS
. The
ASCII code of the character is encoded in bits 9 to 16, counting from
1 and starting at the lowest order position.
C_BOOLEAN_BITS
. Bit 5
(counting from 0 and starting at the lowest order position) is one if
the boolean designates true, or 0 if it is false.
C_SPECIAL_BITS
. Bits 5 to 8 contain an identifying
number for this type of object. The following constants are
defined: C_SCHEME_END_OF_LIST C_SCHEME_UNDEFINED
C_SCHEME_END_OF_FILE
Non-immediate objects are blocks of data represented by a pointer into the heap. The first word of the data block contains a header, which gives information about the type of the object. The header has the size of a machine word, usually 32 bits (64 bits on 64 bit architectures).
C_GC_FORWARDING_BIT
C_BYTEBLOCK_BIT
C_SPECIALBLOCK_BIT
C_8ALIGN_BIT
The actual data follows immediately after the header. Note that block-addresses are always aligned to the native machine-word boundary. Scheme data objects map to blocks in the following manner:
C_PAIR_TYPE
),
where the car and the cdr are contained in the first and second slots,
respectively.
C_VECTOR_TYPE
).
C_STRING_TYPE
).
C_CLOSURE_TYPE
). The first slot contains a pointer to a
compiled C function. Any extra slots contain the free variables (since
a flat closure representation is used).
C_FLONUM_BITS
). Slots one and two (or a single slot on
64 bit architectures) contain a 64-bit floating-point number, in the
representation used by the host systems C compiler.
C_SYMBOL_TYPE
). Slots
one and two contain the toplevel variable value and the print-name
(a string) of the symbol, respectively.
C_PORT_TYPE
). The first slot contains a pointer to a file-
stream, if this is a file-pointer, or NULL if not. The other slots
contain housekeeping data used for this port.
C_STRUCTURE_TYPE
). The first slot contains a symbol that
specifies the kind of structure this record is an instance of. The other
slots contain the actual record items.
C_POINTER_TYPE
). The single slot contains a machine pointer.
C_TAGGED_POINTER_TYPE
), but the object contains an additional
slot with a tag (an arbitrary data object) that identifies the type
of the pointer.
Data objects may be allocated outside of the garbage collected heap, as long as their layout follows the above mentioned scheme. But care has to be taken not to mutate these objects with heap-data (i.e. non-immediate objects), because this will confuse the garbage collector.
For more information see the header file chicken.h
.
call-with-current-continuation
is 126.
eval-when
doesn't allow toplevel definitions inside its
body in combination with hygienic macros.
port-position
currently works only for input ports.
eval
is invoked with scheme-report-environment
or null-environment
inside the interpreter, then non-standard
syntax is still visible, unless the interpreter has been started with
the -strict
option.
format
is not reentrant. This means that recursive invocation
of this procedure (either inside print-object
methods or
record-printer defined with define-record-printer
will
not work.
define-entry-point
.
calendar.scm
example script.
dynamic-wind
.
syntax-case
macro system.
format
.
let-optionals[*]
and
reference implementations of SRFI-1, SRFI-13 and SRFI-14.
Thanks also to:
William Annis, Marc Baily, Peter Barabas, Peter Bex, Dave Bodenstab, T. Kurt Bond, Terence Brannon, Roy Bryant, Taylor Campbell, Franklin Chen, Grzegorz Chrupala, James Crippen, Alejandro Forero Cuervo, Brian Denheyer, Chris Double, Petter Egesund, Daniel B. Faken, Fizzie, Kimura Fuyuki, Martin Gasbichler, Joey Gibson, Johannes Groedem, Andreas Gustafsson, Jun-ichiro itojun Hagino, Matthias Heiler, Karl M. Hegbloom, William P. Heinemann, Dale Jordan, Valentin Kamyshenko, Ron Kneusel, Matthias Koeppe, Todd R. Kueny Sr, Charles Martin, Alain Mellan, Perry Metzger, Scott G. Miller, Mikael, Bruce Mitchener, Eric Merrit, Eric E. Moore, o.t., David Rush, Lars Rustemeier, Oskar Schirmer, Burton Samograd, Ronald Schroder, Spencer Schumann, Shmul, Jeffrey B. Siegal, Robert Skeels, Jason Songhurst, Clifford Stein, Christian Tismer, Vladimir Tsichevsky, Neil van Dyke, Sander Vesik, Shawn Wagner, Matthew Welland, Richard Zidlicky and Houman Zolfaghari for bug-fixes, tips, suggestions and moral support.
http://home.pipeline.com/\~hbaker1/CheneyMTA.html
http://www.schemers.org/Documents/Standards/R5RS
#!...
: Non standard read syntax#$EXPRESSION
: Non standard read syntax#%...
: Non standard read syntax#'EXPRESSION
: Non standard read syntax#,(CONSTRUCTORNAME DATUM ...)
: Non standard read syntax#:SYMBOL
: Non standard read syntax#;EXPRESSION
: Non standard read syntax#<#TAG
: Non standard read syntax#<<TAG
: Non standard read syntax#>
: Non standard read syntax#>!
: Non standard read syntax#>?
: Non standard read syntax#| ... |#
: Non standard read syntax$
: Macros and procedures implemented in the interpreter&
: Macros and procedures implemented in the interpreter*-restult?
: Miscellaneous API*-result-ref
: Miscellaneous API->string
: Strings:optional
: Binding forms for optional arguments<array>
: Builtin classes<boolean>
: Builtin classes<byte-vector>
: Builtin classes<c++-class>
: Builtin classes<char-set>
: Builtin classes<char>
: Builtin classes<class>
: Builtin classes<condition>
: Builtin classes<end-of-file>
: Builtin classes<entity-class>
: Builtin classes<environment>
: Builtin classes<exact>
: Builtin classes<f32vector>
: Builtin classes<f64vector>
: Builtin classes<generic>
: Builtin classes<hash-table>
: Builtin classes<inexact>
: Builtin classes<input-port>
: Builtin classes<integer>
: Builtin classes<locative>
: Builtin classes<lock>
: Builtin classes<method>
: Builtin classes<mmap>
: Builtin classes<null>
: Builtin classes<number>
: Builtin classes<object>
: Builtin classes<output-port>
: Builtin classes<pair>
: Builtin classes<pointer>
: Builtin classes<port>
: Builtin classes<primitive>
: Builtin classes<procedure-class>
: Builtin classes<procedure>
: Builtin classes<promise>
: Builtin classes<queue>
: Builtin classes<s16vector>
: Builtin classes<s32vector>
: Builtin classes<s8vector>
: Builtin classes<string>
: Builtin classes<structure>
: Builtin classes<symbol>
: Builtin classes<tagged-pointer>
: Builtin classes<tcp-listener>
: Builtin classes<time>
: Builtin classes<u16vector>
: Builtin classes<u32vector>
: Builtin classes<u8vector>
: Builtin classes<vector>
: Builtin classes_exit
: Raw exitabsolute-pathname?
: Pathname operationsadd-method
: Base languageadd1
: Arithmeticaddress->pointer
: Foreign pointersadvise
: Macros and procedures implemented in the interpreteralign-to-word
: Foreign pointersalist-ref
: Listsalist-update!
: Listsall-testcase-expectations-true?
: Miscellaneous APIall-testpackage-results-true?
: Miscellaneous APIallocate
: Foreign pointersallocate-instance
: Intercessory protocolalways-bound
: Declarationsand-let*
: Other binding formsandmap
: Other control structuresargc+argv
: Other support proceduresargv
: Environment information and system interfacearithmetic-shift
: Arithmeticassert
: Other formsbinary-search
: Binary searchingbitwise-and
: Arithmeticbitwise-ior
: Arithmeticbitwise-not
: Arithmeticbitwise-xor
: Arithmeticblock
: Declarationsblock-global
: Declarationsblock-ref
: Low-level data accessblock-set!
: Low-level data accessbound-to-procedure
: Declarationsbuild-platform
: Environment information and system interfacebutlast
: Listsbyte-vector
: Bytevectorsbyte-vector->f32vector
: Unit srfi-4byte-vector->f64vector
: Unit srfi-4byte-vector->list
: Bytevectorsbyte-vector->s16vector
: Unit srfi-4byte-vector->s32vector
: Unit srfi-4byte-vector->s8vector
: Unit srfi-4byte-vector->string
: Bytevectorsbyte-vector->u16vector
: Unit srfi-4byte-vector->u32vector
: Unit srfi-4byte-vector->u8vector
: Unit srfi-4byte-vector-fill!
: Bytevectorsbyte-vector-length
: Bytevectorsbyte-vector-ref
: Bytevectorsbyte-vector-set!
: Bytevectorsbyte-vector?
: BytevectorsC_alloc
: C interfaceC_block_item
: C interfaceC_c_string
: C interfaceC_callback
: CallbacksC_character_code
: C interfaceC_data_pointer
: C interfaceC_fix
: C interfaceC_flonum
: C interfaceC_flonum_magnitude
: C interfaceC_gc_protect
: C interfaceC_gc_unprotect
: C interfaceC_header_bits
: C interfaceC_header_size
: C interfaceC_int_to_num
: C interfaceC_intern2
: C interfaceC_intern3
: C interfaceC_list
: C interfaceC_make_character
: C interfaceC_make_header
: C interfaceC_mpointer
: C interfaceC_mutate
: C interfaceC_num_to_int
: C interfaceC_pair
: C interfaceC_pointer_address
: C interfaceC_save
: C interfaceC_SCHEME_END_OF_FILE
: C interfaceC_SCHEME_END_OF_LIST
: C interfaceC_SCHEME_FALSE
: C interfaceC_SCHEME_TRUE
: C interfaceC_SIZEOF_FLONUM
: C interfaceC_SIZEOF_INTERNED_SYMBOL
: C interfaceC_SIZEOF_LIST
: C interfaceC_SIZEOF_LOCATIVE
: C interfaceC_SIZEOF_PAIR
: C interfaceC_SIZEOF_POINTER
: C interfaceC_SIZEOF_STRING
: C interfaceC_SIZEOF_TAGGED_POINTER
: C interfaceC_SIZEOF_VECTOR
: C interfaceC_string
: C interfaceC_string2
: C interfaceC_symbol_value
: C interfaceC_unfix
: C interfaceC_vector
: C interfacecall-with-input-pipe
: Pipescall-with-input-string
: String-port extensionscall-with-output-pipe
: Pipescall-with-output-string
: String-port extensionscall/cc
: call/cccase-lambda
: Binding forms for optional argumentscase-sensitive
: Parameterschange-directory
: Directorieschange-file-mode
: Permissionschange-file-owner
: Permissionschar-name
: User-defined named characterschicken-version
: Environment information and system interfaceCHICKEN_apply
: Entry pointsCHICKEN_apply_to_string
: Entry pointsCHICKEN_delete_gc_root
: Entry pointsCHICKEN_eval
: Entry pointsCHICKEN_eval_string
: Entry pointsCHICKEN_eval_string_to_string
: Entry pointsCHICKEN_eval_to_string
: Entry pointsCHICKEN_gc_root_ref
: Entry pointsCHICKEN_gc_root_set
: Entry pointsCHICKEN_get_error_message
: Entry pointsCHICKEN_global_lookup
: Entry pointsCHICKEN_global_ref
: Entry pointsCHICKEN_global_set
: Entry pointsCHICKEN_initialize
: Entry pointsCHICKEN_invoke
: Entry pointsCHICKEN_is_running
: Entry pointsCHICKEN_load
: Entry pointsCHICKEN_new_gc_root
: Entry pointsCHICKEN_parse_command_line
: Entry pointsCHICKEN_read
: Entry pointsCHICKEN_run
: Entry pointsCHICKEN_yield
: Entry pointschop
: Listsclass-cpl
: Introspectionclass-direct-slots
: Introspectionclass-direct-supers
: Introspectionclass-name
: Introspectionclass-of
: Introspectionclass-slots
: Introspectionclear-hash-table!
: Hash tablesclose-input-pipe
: Pipesclose-output-pipe
: Pipescommand-line-arguments
: Parameterscomplement
: Combinatorscompose
: Combinatorscompress
: Listscompress-literals
: Declarationscompute-apply-generic
: Intercessory protocolcompute-apply-methods
: Intercessory protocolcompute-cpl
: Intercessory protocolcompute-getter-and-setter
: Intercessory protocolcompute-method-more-specific?
: Intercessory protocolcompute-methods
: Intercessory protocolcompute-slots
: Intercessory protocolconc
: Stringscond-expand
: Other formscondition-case
: Exceptionsconjoin
: Combinatorsconstantly
: Combinatorscpu-time
: Execution timecreate-directory
: Directoriescreate-fifo
: Fifoscreate-pipe
: Pipescreate-symbolic-link
: Symbolic linkscreate-temporary-file
: Temporary filescritical-section
: Other formscurrent-directory
: Directoriescurrent-effective-group-id
: Permissionscurrent-effective-user-id
: Permissionscurrent-environment
: Environment accesscurrent-error-port
: File Input/Outputcurrent-group-id
: Permissionscurrent-milliseconds
: Execution timecurrent-process-id
: Processescurrent-seconds
: Execution timecurrent-user-id
: Permissionscut
: Other binding formscute
: Other binding formsdeclare
: Declarationsdecompose-pathname
: Pathname operationsdefine-class
: Defining formsdefine-const-structure
: Unit matchdefine-constant
: Substitution forms and macrosdefine-embedded
: Entry pointsdefine-entry-point
: Entry pointsdefine-external
: Callbacksdefine-foreign-record
: Accessing external objectsdefine-foreign-type
: Accessing external objectsdefine-foreign-variable
: Accessing external objectsdefine-generic
: Defining formsdefine-inline
: Substitution forms and macrosdefine-location
: Locationsdefine-macro
: Substitution forms and macrosdefine-method
: Defining formsdefine-reader-ctor
: Reader extensionsdefine-record
: Record structuresdefine-record-printer
: Record structuresdefine-record-type
: Record structuresdefine-structure
: Unit matchdefine-values
: Other binding formsdelete-directory
: Directoriesdelete-file
: Filesdelete-file*
: Deleting a file without signalling an errordescribe-object
: Additional protocoldestructor-activate!
: Destructor Object APIdestructor-atexit!
: Destructor Object APIdestructor-clear!
: Destructor Object APIdestructor-dump
: Destructor Object APIdirectory
: Directoriesdirectory?
: Directoriesdisable-interrupts
: Interrupts and error-handlingdisable-interrupts
: Declarationsdisjoin
: Combinatorsduplicate-fileno
: File descriptors and low-level I/Odynamic-load-libraries
: Parametersenable-interrupts
: Interrupts and error-handlingenable-warnings
: Interrupts and error-handlingend-of-file
: File Input/Outputensure
: Other formserrno
: Environment information and system interfaceerrno/acces
: ERRNO valueserrno/again
: ERRNO valueserrno/badf
: ERRNO valueserrno/busy
: ERRNO valueserrno/child
: ERRNO valueserrno/fault
: ERRNO valueserrno/intr
: ERRNO valueserrno/inval
: ERRNO valueserrno/io
: ERRNO valueserrno/isdir
: ERRNO valueserrno/mfile
: ERRNO valueserrno/noent
: ERRNO valueserrno/noexec
: ERRNO valueserrno/nomem
: ERRNO valueserrno/nospc
: ERRNO valueserrno/notdir
: ERRNO valueserrno/perm
: ERRNO valueserrno/pipe
: ERRNO valueserrno/rofs
: ERRNO valueserrno/spipe
: ERRNO valueserrno/srch
: ERRNO valueserrno/wouldblock
: ERRNO valueserror
: Interrupts and error-handlingeval
: Evaleval-handler
: Parameterseval-when
: Other formsexecutable-byte-vector->procedure
: Bytevectorsexit
: Environment information and system interfaceexit-handler
: Parametersexpect-eq?
: The Expectation Macro APIexpect-equal?
: The Expectation Macro APIexpect-equivalence-result-lhs-evaled-ref
: Equivalence Style Expectationexpect-equivalence-result-message-ref
: Equivalence Style Expectationexpect-equivalence-result-result-ref
: Equivalence Style Expectationexpect-equivalence-result-rhs-evaled-ref
: Equivalence Style Expectationexpect-equivalence-result-rhs-unevaled-ref
: Equivalence Style Expectationexpect-equivalence-result-specific-ref
: Equivalence Style Expectationexpect-equivalence-result-warning-ref
: Equivalence Style Expectationexpect-equivalence-result-warning?
: Equivalence Style Expectationexpect-equivalence-result?
: Equivalence Style Expectationexpect-eqv?
: The Expectation Macro APIexpect-false
: The Expectation Macro APIexpect-near?
: The Expectation Macro APIexpect-negative
: The Expectation Macro APIexpect-nonzero
: The Expectation Macro APIexpect-positive
: The Expectation Macro APIexpect-result-evaled-ref
: Single Clause Style Expectationexpect-result-message-ref
: Single Clause Style Expectationexpect-result-result-ref
: Single Clause Style Expectationexpect-result-specific-ref
: Single Clause Style Expectationexpect-result-unevaled-ref
: Single Clause Style Expectationexpect-result-warning-ref
: Single Clause Style Expectationexpect-result-warning?
: Single Clause Style Expectationexpect-result?
: Single Clause Style Expectationexpect-tolerance-result-lhs-evaled-ref
: Tolerance Style Expectationexpect-tolerance-result-lhs-tol-evaled-ref
: Tolerance Style Expectationexpect-tolerance-result-message-ref
: Tolerance Style Expectationexpect-tolerance-result-result-ref
: Tolerance Style Expectationexpect-tolerance-result-rhs-evaled-ref
: Tolerance Style Expectationexpect-tolerance-result-rhs-unevaled-ref
: Tolerance Style Expectationexpect-tolerance-result-specific-ref
: Tolerance Style Expectationexpect-tolerance-result-warning-ref
: Tolerance Style Expectationexpect-tolerance-result-warning?
: Tolerance Style Expectationexpect-tolerance-result?
: Tolerance Style Expectationexpect-true
: The Expectation Macro APIexpect-zero
: The Expectation Macro APIexport
: Declarationsextend-procedure
: Extending procedures with dataextended-bindings
: Declarationsextended-procedure?
: Extending procedures with dataextension-info
: Loading extension librariesf32vector->byte-vector
: Unit srfi-4f64vector->byte-vector
: Unit srfi-4features
: Feature identifiersfifo?
: Fifosfile-close
: File descriptors and low-level I/Ofile-execute-access?
: Permissionsfile-exists?
: Filesfile-lock
: Record lockingfile-lock/blocking
: Record lockingfile-mkstemp
: File descriptors and low-level I/Ofile-modification-time
: Retrieving file attributesfile-open
: File descriptors and low-level I/Ofile-owner
: Permissionsfile-permissions
: Permissionsfile-position
: Retrieving file attributesfile-read
: File descriptors and low-level I/Ofile-read-access?
: Permissionsfile-select
: File descriptors and low-level I/Ofile-size
: Retrieving file attributesfile-test-lock
: Record lockingfile-truncate
: Changing file attributesfile-unlock
: Record lockingfile-write
: File descriptors and low-level I/Ofile-write-access?
: Permissionsfileno/stderr
: File descriptors and low-level I/Ofileno/stdin
: File descriptors and low-level I/Ofileno/stdout
: File descriptors and low-level I/Ofind-files
: Finding filesfixnum-arithmetic
: Declarationsfixnum?
: Arithmeticflatten
: Listsflip
: Combinatorsfluid-let
: Other binding formsflush-output
: File Input/Outputfor-each-argv-line
: Iterating over input lines and filesfor-each-line
: Iterating over input lines and filesforce-finalizers
: Parametersforeign-callback-lambda
: Accessing external objectsforeign-callback-lambda*
: Accessing external objectsforeign-callback-wrapper
: Callbacksforeign-code
: Accessing external objectsforeign-declare
: Declarationsforeign-lambda
: Accessing external objectsforeign-lambda*
: Accessing external objectsforeign-parse
: Declarationsforeign-value
: Accessing external objectsformat
: Unit formatfprintf
: Formatted outputfree
: Foreign pointersfx*
: Arithmeticfx+
: Arithmeticfx-
: Arithmeticfx/
: Arithmeticfx<
: Arithmeticfx<=
: Arithmeticfx=
: Arithmeticfx>
: Arithmeticfx>=
: Arithmeticfxmax
: Arithmeticfxmin
: Arithmeticfxmod
: Arithmeticfxneg
: Arithmeticgc
: Garbage collectiongeneric-methods
: Introspectiongensym
: Generating uninterned symbolsget
: Hash tablesget-groups
: Permissionsget-host-name
: Getting the hostname and system informationget-keyword
: Keywordsget-line-number
: Macrosget-output-string
: String portsgetenv
: Environment information and system interfaceglob
: Directoriesglobal-bound?
: Accessing toplevel variablesglobal-ref
: Accessing toplevel variablesglobal-set!
: Accessing toplevel variablesgloss
: Gloss APIgloss-result-message-ref
: Gloss APIgloss-result-warning-ref
: Gloss APIgloss-result-warning?
: Gloss APIgloss-result?
: Gloss APIgrep
: Unit regexgroup-information
: Permissionshash-table->list
: Hash tableshash-table-count
: Hash tableshash-table-for-each
: Hash tableshash-table-ref
: Hash tableshash-table-remove!
: Hash tableshash-table-set!
: Hash tableshash-table-size
: Hash tableshash-table?
: Hash tableshide
: Declarationsidentity
: Combinatorsimplicit-exit-handler
: Parametersinclude
: Other formsinitialize
: Intercessory protocolinitialize-groups
: Permissionsinitialize-slots
: Utility proceduresinstall-extension
: Procedures and macros available in setup scriptsinstall-highlevel-macro-system
: chicken-highlevel-macros.scminstall-program
: Procedures and macros available in setup scriptsinstall-script
: Procedures and macros available in setup scriptsinstance?
: Base languageinterrupts-enabled
: Declarationsintersperse
: Listsinvalid-procedure-call-handler
: Procedure-call- and variable reference hooksinvoke-executable-byte-vector
: Bytevectorsjoin
: Listskeyword->string
: Keywordskeyword-style
: Parameterskeyword?
: Keywordslet*-values
: Other binding formslet-location
: Locationslet-optionals
: Binding forms for optional argumentslet-optionals*
: Binding forms for optional argumentslet-values
: Other binding formsletrec-values
: Other binding formslist->byte-vector
: Bytevectorslist->queue
: Queueslist-of
: Combinatorsload
: Loading codeload-library
: Loading codeload-noisily
: Loading codeload-verbose
: Parameterslocation
: Locationslocative->object
: Locativeslocative-ref
: Locativeslocative-set!
: Locativeslocative?
: Locativesmachine-type
: Environment information and system interfacemacro?
: Macrosmacroexpand
: Macrosmacroexpand-1
: Macrosmake
: Procedures and macros available in setup scriptsmake
: Base languagemake-absolute-pathname
: Pathname operationsmake-byte-vector
: Bytevectorsmake-class
: Base languagemake-executable-byte-vector
: Bytevectorsmake-generic
: Base languagemake-hash-table
: Hash tablesmake-input-port
: Input/Output extensionsmake-locative
: Locativesmake-method
: Base languagemake-output-port
: Input/Output extensionsmake-parameter
: Parametersmake-pathname
: Pathname operationsmake-queue
: Queuesmake-record-instance
: Low-level data accessmake-static-byte-vector
: Bytevectorsmake-weak-locative
: Locativesmap-file-to-memory
: Memory mapped I/Omatch
: Unit matchmatch-define
: Unit matchmatch-error-control
: Unit matchmatch-lambda
: Unit matchmatch-lambda*
: Unit matchmatch-let
: Unit matchmatch-let*
: Unit matchmatch-letrec
: Unit matchmemory-mapped-file-pointer
: Memory mapped I/Omemory-statistics
: Garbage collectionmerge
: Sortingmerge!
: Sortingmethod-procedure
: Introspectionmethod-specializers
: Introspectionmove-memory!
: Low-level data accessno-argc-checks
: Declarationsno-bound-checks
: Declarationsno-procedure-checks
: Declarationsnot
: Declarationsnth-value
: Other formsnull-pointer
: Foreign pointersnull-pointer?
: Foreign pointersnumber-of-bytes
: Low-level data accessnumber-of-slots
: Low-level data accessobject->pointer
: Foreign pointersobject-become!
: Magicobject-copy
: Low-level data accessobject-evict
: Data in unmanaged memoryobject-evict-to-location
: Data in unmanaged memoryobject-evicted?
: Data in unmanaged memoryobject-release
: Data in unmanaged memoryobject-size
: Data in unmanaged memoryobject-unevict
: Data in unmanaged memoryopen-input-file*
: File descriptors and low-level I/Oopen-input-pipe
: Pipesopen-input-string
: String portsopen-output-file*
: File descriptors and low-level I/Oopen-output-pipe
: Pipesopen-output-string
: String portsopen/append
: File descriptors and low-level I/Oopen/binary
: File descriptors and low-level I/Oopen/creat
: File descriptors and low-level I/Oopen/excl
: File descriptors and low-level I/Oopen/fsync
: File descriptors and low-level I/Oopen/noctty
: File descriptors and low-level I/Oopen/nonblock
: File descriptors and low-level I/Oopen/rdonly
: File descriptors and low-level I/Oopen/rdwr
: File descriptors and low-level I/Oopen/read
: File descriptors and low-level I/Oopen/sync
: File descriptors and low-level I/Oopen/text
: File descriptors and low-level I/Oopen/trunc
: File descriptors and low-level I/Oopen/write
: File descriptors and low-level I/Oopen/wronly
: File descriptors and low-level I/Oormap
: Other control structuresoutput-style-human
: Output Generation APIparameterize
: Other binding formsparent-process-id
: Processespatch
: Procedures and macros available in setup scriptspathname-directory
: Pathname operationspathname-directory-separator
: Filespathname-extension
: Pathname operationspathname-extension-separator
: Filespathname-file
: Pathname operationspathname-replace-directory
: Pathname operationspathname-replace-extension
: Pathname operationspathname-replace-file
: Pathname operationspathname-strip-directory
: Pathname operationspathname-strip-extension
: Pathname operationspattern->regexp
: Unit regexperm/irgrp
: Permissionsperm/iroth
: Permissionsperm/irusr
: Permissionsperm/irwxg
: Permissionsperm/irwxo
: Permissionsperm/irwxu
: Permissionsperm/isgid
: Permissionsperm/isuid
: Permissionsperm/isvtx
: Permissionsperm/iwgrp
: Permissionsperm/iwoth
: Permissionsperm/iwusr
: Permissionsperm/ixgrp
: Permissionsperm/ixoth
: Permissionsperm/ixusr
: Permissionspipe/buf
: Pipespointer->address
: Foreign pointerspointer->object
: Foreign pointerspointer-f32-ref
: Foreign pointerspointer-f32-set!
: Foreign pointerspointer-f64-ref
: Foreign pointerspointer-f64-set!
: Foreign pointerspointer-offset
: Foreign pointerspointer-s16-ref
: Foreign pointerspointer-s16-set!
: Foreign pointerspointer-s32-ref
: Foreign pointerspointer-s32-set!
: Foreign pointerspointer-s8-ref
: Foreign pointerspointer-s8-set!
: Foreign pointerspointer-tag
: Tagged pointerspointer-u16-ref
: Foreign pointerspointer-u16-set!
: Foreign pointerspointer-u32-ref
: Foreign pointerspointer-u32-set!
: Foreign pointerspointer-u8-ref
: Foreign pointerspointer-u8-set!
: Foreign pointerspointer?
: Foreign pointersport->fileno
: File descriptors and low-level I/Oport-name
: File Input/Outputport-position
: File Input/Outputport?
: Standard Input/Outputpp
: Input/Output extensionspretty-print
: Input/Output extensionspretty-print-width
: Input/Output extensionsprint
: Standard Input/Outputprint*
: Standard Input/Outputprint-backtrace
: Interrupts and error-handlingprint-error-message
: Interrupts and error-handlingprint-object
: Additional protocolprintf
: Formatted outputprintinl
: Output Generation APIprintnl
: Output Generation APIprocedure-data
: Extending procedures with dataprocess
: Processesprocess-execute
: Processesprocess-fork
: Processesprocess-run
: Processesprocess-signal
: Processesprocess-wait
: Processesproject
: Combinatorsprovide
: Loading extension librariesprovided?
: Loading extension librariesput!
: Hash tablesqueue->list
: Queuesqueue-add!
: Queuesqueue-empty?
: Queuesqueue-first
: Queuesqueue-last
: Queuesqueue-remove!
: Queuesqueue?
: Queuesrandom
: Random numbersrandomize
: Random numbersread-all
: Reading a file's contentsread-file
: Input/Output extensionsread-line
: Input/Output extensionsread-lines
: Input/Output extensionsread-string
: Input/Output extensionsread-symbolic-link
: Symbolic linksread-token
: Input/Output extensionsreceive
: Other binding formsrecord->vector
: Low-level data accessrecord-instance?
: Low-level data accessregexp
: Unit regexregexp?
: Unit regexregister-feature!
: Feature identifiersrename-file
: Filesrepl
: Read-eval-print looprepl-prompt
: Parametersrepository-path
: Loading extension librariesrequire
: Loading extension librariesrequire-at-runtime
: Procedures and macros available in setup scriptsrequire-extension
: Making extra libraries and extensionsd availablereset
: Interrupts and error-handlingreset-handler
: Parametersreverse-list->string
: String utilitiesrun
: Procedures and macros available in setup scriptsrun-time-macros
: Declarationss16vector->byte-vector
: Unit srfi-4s32vector->byte-vector
: Unit srfi-4s8vector->byte-vector
: Unit srfi-4seconds->local-time
: Time routinesseconds->string
: Time routinesseconds->utc-time
: Time routinesset!-values
: Other binding formsset-alarm!
: Signal handlingset-buffering-mode!
: Setting a files buffering modeset-file-position!
: Changing file attributesset-finalizer!
: Garbage collectionset-gc-report!
: Garbage collectionset-groups!
: Permissionsset-port-name!
: File Input/Outputset-procedure-data!
: Extending procedures with dataset-read-syntax!
: Reader extensionsset-signal-handler!
: Signal handlingset-signal-mask!
: Signal handlingset-user-id!
: Permissionssetenv
: Environment accessshuffle
: Listsside-effect
: Side Effect APIsignal/abrt
: Signal handlingsignal/alrm
: Signal handlingsignal/chld
: Signal handlingsignal/cont
: Signal handlingsignal/fpe
: Signal handlingsignal/hup
: Signal handlingsignal/ill
: Signal handlingsignal/int
: Signal handlingsignal/io
: Signal handlingsignal/kill
: Signal handlingsignal/pipe
: Signal handlingsignal/prof
: Signal handlingsignal/quit
: Signal handlingsignal/segv
: Signal handlingsignal/stop
: Signal handlingsignal/term
: Signal handlingsignal/trap
: Signal handlingsignal/tstp
: Signal handlingsignal/urg
: Signal handlingsignal/usr1
: Signal handlingsignal/usr2
: Signal handlingsignal/vtalrm
: Signal handlingsignal/winch
: Signal handlingsignal/xcpu
: Signal handlingsignal/xfsz
: Signal handlingsignum
: Arithmeticskip
: Skip APIskip-result-message-ref
: Skip APIskip-result-warning-ref
: Skip APIskip-result-warning?
: Skip APIskip-result?
: Skip APIsleep
: Processesslot-ref
: Base languageslot-set!
: Base languagesoftware-type
: Environment information and system interfacesoftware-version
: Environment information and system interfacesort
: Sortingsort!
: Sortingsorted?
: Sortingsprintf
: Formatted outputstandard-bindings
: Declarationsstatic-byte-vector->pointer
: Bytevectorsstrict-reader
: Parametersstring->byte-vector
: Bytevectorsstring->keyword
: Keywordsstring->uninterned-symbol
: Generating uninterned symbolsstring-chop
: Stringsstring-compare3
: Stringsstring-compare3-ci
: Stringsstring-intersperse
: Stringsstring-match
: Unit regexstring-match-positions
: Unit regexstring-search
: Unit regexstring-search-positions
: Unit regexstring-split
: Stringsstring-split-fields
: Unit regexstring-substitute
: Unit regexstring-substitute*
: Unit regexstring-translate
: Stringsstring-translate*
: Stringssub1
: Arithmeticsubclass?
: Introspectionsubf32vector
: Unit srfi-4subf64vector
: Unit srfi-4subs16vector
: Unit srfi-4subs32vector
: Unit srfi-4subs8vector
: Unit srfi-4substring-ci=?
: Stringssubstring-index
: Stringssubstring-index-ci
: Stringssubstring=?
: Stringssubu16vector
: Unit srfi-4subu32vector
: Unit srfi-4subu8vector
: Unit srfi-4switch
: Conditional formssyntax
: Procedures and macros available in setup scriptssyntax-error
: Macrossystem
: Environment information and system interfacesystem*
: Executing shell commands with formatstring and error checkingsystem-information
: Getting the hostname and system informationtag-pointer
: Tagged pointerstagged-pointer?
: Tagged pointerstail?
: Liststcp-abandon-port
: Unit tcptcp-accept
: Unit tcptcp-accept-ready?
: Unit tcptcp-addresses
: Unit tcptcp-close
: Unit tcptcp-connect
: Unit tcptcp-listen
: Unit tcptcp-listener-port
: Unit tcptcp-listener?
: Unit tcpterminal-name
: Terminal portsterminal-port?
: Terminal portsterminate
: Termination APIterminate-result-container-ref
: Termination APIterminate-result-message-ref
: Termination APIterminate-result-result-ref
: Termination APIterminate-result-scope-ref
: Termination APIterminate-result?
: Termination APItest-case
: The Test Case Macro APItest-case-result-expectations-ref
: Test Case Result Object APItest-case-result-message-ref
: Test Case Result Object APItest-case-result-result-ref
: Test Case Result Object APItest-case-result-warning-ref
: Test Case Result Object APItest-case-result-warning?
: Test Case Result Object APItest-case-result?
: Test Case Result Object APItest-package
: The Test Package Macro APItest-package-result-exps-ref
: Test Package Result Object APItest-package-result-message-ref
: Test Package Result Object APItest-package-result-result-ref
: Test Package Result Object APItest-package-result-warning-ref
: Test Package Result Object APItest-package-result-warning?
: Test Package Result Object APItest-package-result?
: Test Package Result Object APIthread-deliver-signal!
: Unit srfi-18thread-quantum
: Unit srfi-18thread-quantum-set!
: Unit srfi-18time
: Other formstime->string
: Time routinestodo
: Todo APItodo-result-message-ref
: Todo APItodo-result-warning-ref
: Todo APItodo-result-warning?
: Todo APItodo-result?
: Todo APItrace
: Macros and procedures implemented in the interpreterTYPE
: DeclarationsTYPENAME-SLOTNAME
: Accessing external objectsTYPENAME-SLOTNAME-set!
: Accessing external objectsu16vector->byte-vector
: Unit srfi-4u32vector->byte-vector
: Unit srfi-4u8vector->byte-vector
: Unit srfi-4unadvise
: Macros and procedures implemented in the interpreterunbound-variable-value
: Procedure-call- and variable reference hooksundefine-macro!
: Macrosunit
: Declarationsunless
: Conditional formsunmap-file-from-memory
: Memory mapped I/Ounregister-feature!
: Feature identifiersunsafe
: Declarationsunsetenv
: Environment accessuntrace
: Macros and procedures implemented in the interpreteruse
: Making extra libraries and extensionsd availableuser-information
: Permissionsuser-options-pass
: Extending the compileruser-pass
: Extending the compileruser-pass-2
: Extending the compileruser-post-analysis-pass
: Extending the compileruser-preprocessor-pass
: Extending the compileruser-read-pass
: Extending the compileruses
: Declarationsusual-integrations
: Declarationsvector-copy!
: Vectorsvector-resize
: Vectorsversion
: Procedures and macros available in setup scriptsvisit
: Unit syntax-casevoid
: The unspecified valuewhen
: Conditional formswith-error-output-to-port
: Input/Output extensionswith-input-from-pipe
: Pipeswith-input-from-port
: Input/Output extensionswith-input-from-string
: String-port extensionswith-output-to-pipe
: Pipeswith-output-to-port
: Input/Output extensionswith-output-to-string
: String-port extensionswrite-line
: Input/Output extensionswrite-string
: Input/Output extensions