Unix-like systems support a mechanism where a script can
specify a program that should execute it. The convention
is that the first line of the file should start with the two characters
#!’ followed by the absolute path of the program that should
process (interpret) the script.
This is convention works well for script languages that use ‘
to indicate the start of a comment, since the interpreter will
automatically ignore the line specifying the interpreter filename.
Scheme, however, uses ‘
#’ for various special objects,
and Kawa specifically uses ‘
#!’ as a prefix for
various Special named constants such as
Kawa does recognize the three-character sequence ‘
#!/’ at the
beginning of a file as special, and ignores it. So you can
specify command interpreters, as long as you don’t put a space
between the ‘
#!’ and the interpreter filename.
Here is an example:
#!/usr/local/bin/kawa (format #t "The time is ~s~%" (make <java.util.Date>))
If this file has the execute permission set and is in your
then you can execute it just by naming it on command line. The
system kernel will automatically execute
kawa, passing it the
filename as an argument.
Note that the full path-name of the
must be hard-wired into the script. This means you may have to edit
the script depending on where Kawa is installed on your system.
Another possible problem is that the interpreter must be an
actual program, not a shell script. Depending on how you configure
and install Kawa,
kawa can be a real program or a script.
You can avoid both problems by the
env program, available on
most modern Unix-like systems:
#!/usr/bin/env kawa (format #t "The time is ~s~%" (make <java.util.Date>))
If you need to specify extra arguments to
you can use the following trick:
#!/bin/sh exec kawa --commonlisp out:base=16 --script2 "$0" "$@" (setq xx 20) (display xx) (newline)
This causes the shell to invoke the
kawa is in the command path;
if not replace
kawa by the appropriate incantation,
which can be multiple words (for example
exec tells the shell to replace itself by
this is important so the shell doesn’t continue with this file
when done with
The rest of the line can contain whatever commands and options you
want when executing Kawa. The important part is
The shell replaces the
"$0" by the name the script, and
"$@" by the remaining arguments passed to the script.
So what Kawa sees is the
--script2 option followed the script name,
followed by remaining command-line arguments.
--script2 tells Kawa to execute the script, after ignoring
the initial two lines, which would confuse it terribly.