You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
41 lines
1.8 KiB
Plaintext
41 lines
1.8 KiB
Plaintext
When MzScheme is installed as part of the standard Unix PLT
|
|
distribution, the executable ${PLTHOME}/bin/mzscheme is actually a
|
|
script that selects an executable based on the current platform. This
|
|
is done to support multiple platforms in a single PLT installation.
|
|
|
|
Unfortunately, this causes problems for writing scripts that use
|
|
MzScheme, because the shell's #! convention requires that a binary is
|
|
specified.
|
|
|
|
Fortunately, there is a sneaky workaround. To write a MzScheme script,
|
|
use the following at the top of your script:
|
|
|
|
#!/bin/sh
|
|
string=? ; exec ${PLTHOME}/bin/mzscheme -r $0 $0 ${1+"$@"}
|
|
|
|
... <scheme program> ...
|
|
|
|
(It may be better to hardwire the path to mzscheme instead of using
|
|
${PLTHOME}.)
|
|
|
|
Within <scheme program>, (vector-ref argv 0) is the name of the
|
|
script; arguments passed to the script start at (vector-ref argv 1).
|
|
|
|
How does this work? "#!/bin/sh" causes the shell to run /bin/sh on the
|
|
file. The first command, "string=?" is a harmless assignment, and ";"
|
|
separates this assignment from the "exec" command. The "exec" command
|
|
replaces /bin/sh with mzscheme (so /bin/sh does not see the actual
|
|
Scheme program). The "-r" flag tells mzscheme to load the next
|
|
argument as a script and forces the remaining arguments into
|
|
`argv'. (For information on ${1+"$@"}, consult your `sh' man page.)
|
|
Thus, mzscheme will start up and load this file. As always, mzscheme
|
|
ignores "#!" in the first line of a loaded file as a comment. And
|
|
"string=?" is again a harmless expression (since it's a built-in
|
|
variable). The ";" starts a Scheme comment, so the "exec" expression
|
|
is ignored. Finally, mzscheme continues to load the file and evaluates
|
|
the real Scheme program.
|
|
|
|
Thanks to J. P. Lewis <zilla@interval.com> for the basic idea behind
|
|
this trick. Many others have suggested alternatives to `string=?'
|
|
for shells other than /bin/sh.
|