Copyright © 2000-2005, 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:
CHICKEN - A practical and portable Scheme system User's manual (Version 2, Build 228)
(c) 2000-2005, 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
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:
match package
This manual is merely a reference for the CHICKEN system and assumes a working knowledge of Scheme.
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")
Macro definitions are only available when processed
by include. 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 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) 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.
A program 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.
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-no-trace -no-lambda-info -optimize-level 3
-fixnum-arithmetic -disable-interrupts -block -lambda-lift.
-blockeval and unused toplevel bindings are removed.
-case-insensitivecase-insensitive
feature identifier.
-check-syntax-compress-literals THRESHOLDTHRESHOLD 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 MODESMODES is a string
of characters that select debugging information about the compiler that
will be printed to standard output.
-debug-level LEVELLEVEL should be an integer.
-debug-level 0 is equivalent to -no-trace -no-lambda-info
-debug-level 1 is equivalent to -no-trace
-debug-level 2 does nothing (the default)
-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 FILENAMEFILENAME at the end of the compiled source file. The include-path
is not searched. This option may be given multiple times.
-emit-external-prototypes-firstdefine-external before any
other foreign declarations. This is sometimes useful, when C/C++ code embedded into
the a Scheme program has to access the callbacks. By default the prototypes are emitted
after foreign declarations.
-explicit-uselibrary, eval and extras.
Use this option if compiling a library unit instead of an application
unit.
-extend FILENAME-extension-prelude '(define-extension <NAME>)', where
<NAME> is the basename of the currently compiled file.
-feature SYMBOLSYMBOL to be a valid feature identifier for
cond-expand.
-ffi#>! ... <#.
-ffi-parse#>? ... <#.
-ffi-define SYMBOLforeign-parse
declarations.
-ffi-include-path PATH-ffi-no-include-fixnum-arithmetic(fixnum-arithmetic) declaration. Assume all
mathematical operations use small integer arguments.
-heap-size NUMBERNUMBER
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-include-path PATHNAMEinclude 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.
-inline-inline-limit option).
-inline-limit THRESHOLD-inline option.
The default threshold is 10.
-keyword-style STYLESTYLE may be either
prefix (as in Common Lisp), suffix (as in DSSSL) or none.
Any other value is ignored. The default is suffix.
-lambda-lift-no-lambda-infolambda expression (currently the argument-list,
after alpha-conversion/renaming).
-no-trace-no-trace
is specified. With this option the generated
code is slightly faster.
-no-warnings-nursery NUMBER-stack-size NUMBERNUMBER 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 LEVELLEVEL should be
an integer.
-optimize-level 0 does nothing.
-optimize-level 1 is equivalent to
-optimize-leaf-routines
-optimize-level 2 is currently the same as -optimize-level 1
-optimize-level 3 is equivalent to
-optimize-leaf-routines -unsafe
-output-file FILENAMEFILENAME.c.
-postlude EXPRESSIONSEXPRESSIONS 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 EXPRESSIONSEXPRESSIONS 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-accumulate-profileexit
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-profile program to display the profiling
information in a more user-friendly form. Enter chicken-profile
with no arguments at the command line to get a list of available options.
The -accumulate-profile option is similar to -profile, but
the resulting profile information will be appended to any existing
PROFILE file. chicken-profile will merge and sum up the accumulated
timing information, if several entries for the same procedure calls exist.
-profile-name FILENAMEPROFILE. Implies -profile.
-prologue FILENAMEFILENAME at the start of the compiled
source file. The include-path is not searched. This option may be given
multiple times.
-quiet-rawruntime.c and chicken.h).
-require-extension NAMENAME before the compilation process
commences. This is identical to adding (require-extension NAME) at the start of
the compiled program.
-run-time-macros-split NUMBERfilename0, ..., filename<NUMBER-1> with as many
files as given in NUMBER.
-split-level NUMBER-to-stdout.c file.
-unit NAME
-prelude "(declare (unit NAME))"
-unsafe-unsafe-libraries-uses NAMENAME. This is equivalent to
-prelude "(declare (uses NAME))"
-no-usual-integrations(not usual-integrations).
-version-verboseThe 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:
-:?-:b-:ccsi) to force output of the #;N> prompt even if stdin
is not a terminal (for example if running in an emacs buffer
under Windows).
-:d-:hNUMBER-:hiNUMBER-:hgPERCENTAGEPERCENTAGE.
The default is 200.
-:hmNUMBER-:hsPERCENTAGEPERCENTAGE 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-:fNUMBER-:aNUMBER-:w-:r-no-trace
options.
-:x-:x is not given, a warning will be shown, though.
-:BThe 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) 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
% csc foo.scm
% 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
% csc -c bar.scm
% csc foo.scm bar.o -o foo
% 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.
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-extendoption, 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
-preludeoptions. The second argument is a list of source files including any files specified by-prologueand-epilogue. The third argument is a list of strings specified using-postludeoptions. 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 as its sole argument. 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.
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. The following example shows a minimal application, which
should run without changes on the most frequent operating systems, like Windows,
Linux or FreeBSD:
Let's take a simple “Hello, world!”:
; hello.scm (print "Hello, world!")
Compiled to C, we get hello.c. We need the files chicken.h and
runtime.c, which contain the basic runtime system, plus the three basic library
files library.c, eval.c and extras.c which contain the same functionality as the
library linked into a plain CHICKEN-compiled application, or which is available by default in the
iinterpreter, csi:
% csc hello.scm -O2 -d1
A simple makefile is needed as well:
# Makefile for UNIX systems
hello: hello.o runtime.o library.o eval.o extras.o
$(CC) -o hello hello.o runtime.o library.o eval.o extras.o -lm
hello.o: chicken.h
runtime.o: chicken.h
library.o: chicken.h
eval.o: chicken.h
extras.o: chicken.h
Now we have all files together, and can create an tarball containing all the files:
% tar cf hello.tar Makefile hello.c runtime.c library.c eval.c extras.c chicken.h % gzip hello.tar
This is of naturally rather simplistic. Things like enabling dynamic loading, estimating the optimal stack-size and selecting supported features of the host system would need more configuration- and build-time support. All this can be addressed using more elaborate build-scripts, makefiles or by using autoconf/automake/libtool.
Note also that the size of the application can still be reduced by removing extras and
eval and compiling hello.scm with the -explicit-use option.
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 interactively.
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.
-i -case-insensitivecase-insensitive
feature identifier.
-b -batch-e -eval EXPRESSIONSEXPRESSIONS. This option implies -batch and -quiet,
so no startup message will be printed and the interpreter exits after processing
all -eval options and/or loading files given on the command-line.
-D -feature SYMBOLSYMBOL to be a valid feature identifier for
cond-expand.
-h -help-I -include-path PATHNAMEinclude 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.
-k -keyword-style STYLESTYLE may be either
prefix (as in Common Lisp) or suffix (as in DSSSL).
Any other value is ignored.
-n -no-init-w -no-warnings-q -quiet-s -script PATHNAME-batch -quiet -no-init
PATHNAME. Arguments following PATHNAME are available by using
command-line-arguments and are not processed as interpreter
options. Extra options in the environment variable CSI_OPTIONS
are ignored.
-R -require-extension NAME(require-extension NAME).
-v -version#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the -script option terpreter command line format,
Up: Using the interpreter
#! notation for starting scripts,
anything following the characters #! is ignored, with the exception of the special
symbols #!optional, #!key, #!rest and #!eof.
The easiest way is to use the