How to write Guile scripts
Guile is a Scheme implementation that comes with many GNU/Linux distributions. Some of Guile's attributes make it very practical to use on UNIX-like systems:
- Ability to write quick scripts with low start-up time.
- Relatively low-level access to system calls, if needed.
- Supports interaction with C code.
This document outlines the basic interaction between Guile and the UNIX environment.
Making it executable
Mark your file as executable (chmod +x FILENAME) and begin your
Guile script with these three lines:
#!/usr/bin/guile \ -e main -s !#
How parameters are passed
When executing such a Guile file, UNIX will run the command
/usr/bin/guile '\' FILENAME ARG1 ARG2 ... ARGN
Guile will recognize the backslash parameter \ ("meta switch") and
behave as if it had been called with the additional parameters on the
second line of the file.
/usr/bin/guile -e main -s FILENAME ARG1 ARG2 ... ARGN
The interpreter will now load the script in FILENAME, ignore the
first three lines as multiline comment, and call the procedure named
main with the argument list (including the script name)
(list FILENAME ARG1 ARG2 ... ARGN), as instructed by the -e main
parameter. (You will need to have the procedure main defined.)
Quick summary of the options being used here:
-s FILE: load the given file-e NAME: execute(NAME ARG1 ARG2 ... ARGN)
Example
This is a simplified implementation of the echo utility.
#!/usr/bin/guile \ -e main -s !# (define (main args) (display (string-join (cdr args) " ")) (newline))
Note that we skip the first element of args, which contains the
script's filename.
To execute it, run:
$ chmod +x echo.scm $ ./echo.scm hello world hello world
This may spit some compiler notes on first execution.
Comparison with other languages
Normally, UNIX-enabled scripting languages only require one hashbang
(#!) line to specify the interpreter to be used. Many languages
deal with this by making the hash (#) character the character which
starts a one-line comment.
In Guile, one-line comments are started with a semicolon (;). #!
denotes the start of a multiline comment, which is closed with !#.
Therefore, scripts starting with a hashbang section as above will
still be valid Guile scripts.
More information
Section "Guile Scripting" in the Guile Reference Manual