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:

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:

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