use correct url to ftp.gnu.org
[bpt/guile.git] / doc / ref / scheme-scripts.texi
CommitLineData
07d83abe
MV
1@c -*-texinfo-*-
2@c This is part of the GNU Guile Reference Manual.
44fd0a72 3@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2005
07d83abe
MV
4@c Free Software Foundation, Inc.
5@c See the file guile.texi for copying conditions.
6
7@page
8@node Guile Scripting
9@section Guile Scripting
10
11Like AWK, Perl, or any shell, Guile can interpret script files. A Guile
12script is simply a file of Scheme code with some extra information at
13the beginning which tells the operating system how to invoke Guile, and
14then tells Guile how to handle the Scheme code.
15
16@menu
17* The Top of a Script File:: How to start a Guile script.
18* Invoking Guile:: Command line options understood by Guile.
19* The Meta Switch:: Passing complex argument lists to Guile
20 from shell scripts.
21* Command Line Handling:: Accessing the command line from a script.
22* Scripting Examples::
23@end menu
24
25
26@node The Top of a Script File
27@subsection The Top of a Script File
28
29The first line of a Guile script must tell the operating system to use
30Guile to evaluate the script, and then tell Guile how to go about doing
31that. Here is the simplest case:
32
33@itemize @bullet
34
35@item
36The first two characters of the file must be @samp{#!}.
37
38The operating system interprets this to mean that the rest of the line
39is the name of an executable that can interpret the script. Guile,
40however, interprets these characters as the beginning of a multi-line
41comment, terminated by the characters @samp{!#} on a line by themselves.
42(This is an extension to the syntax described in R5RS, added to support
43shell scripts.)
44
45@item
46Immediately after those two characters must come the full pathname to
47the Guile interpreter. On most systems, this would be
48@samp{/usr/local/bin/guile}.
49
50@item
51Then must come a space, followed by a command-line argument to pass to
52Guile; this should be @samp{-s}. This switch tells Guile to run a
53script, instead of soliciting the user for input from the terminal.
54There are more elaborate things one can do here; see @ref{The Meta
55Switch}.
56
57@item
58Follow this with a newline.
59
60@item
61The second line of the script should contain only the characters
62@samp{!#} --- just like the top of the file, but reversed. The
63operating system never reads this far, but Guile treats this as the end
64of the comment begun on the first line by the @samp{#!} characters.
65
8748ffea
MG
66@item
67If this source code file is not ASCII or ISO-8859-1 encoded, a coding
68declaration such as @code{coding: utf-8} should appear in a comment
69somewhere in the first five lines of the file: see @ref{Character
70Encoding of Source Files}.
71
07d83abe
MV
72@item
73The rest of the file should be a Scheme program.
74
75@end itemize
76
77Guile reads the program, evaluating expressions in the order that they
78appear. Upon reaching the end of the file, Guile exits.
79
80
81@node Invoking Guile
82@subsection Invoking Guile
44fd0a72 83@cindex invocation
07d83abe
MV
84
85Here we describe Guile's command-line processing in detail. Guile
86processes its arguments from left to right, recognizing the switches
87described below. For examples, see @ref{Scripting Examples}.
88
89@table @code
90
91@item -s @var{script} @var{arg...}
92Read and evaluate Scheme source code from the file @var{script}, as the
93@code{load} function would. After loading @var{script}, exit. Any
94command-line arguments @var{arg...} following @var{script} become the
95script's arguments; the @code{command-line} function returns a list of
96strings of the form @code{(@var{script} @var{arg...})}.
97
98@item -c @var{expr} @var{arg...}
99Evaluate @var{expr} as Scheme code, and then exit. Any command-line
100arguments @var{arg...} following @var{expr} become command-line arguments; the
101@code{command-line} function returns a list of strings of the form
102@code{(@var{guile} @var{arg...})}, where @var{guile} is the path of the
103Guile executable.
104
105@item -- @var{arg...}
106Run interactively, prompting the user for expressions and evaluating
107them. Any command-line arguments @var{arg...} following the @code{--}
108become command-line arguments for the interactive session; the
109@code{command-line} function returns a list of strings of the form
110@code{(@var{guile} @var{arg...})}, where @var{guile} is the path of the
111Guile executable.
112
fcb8ba8c
MV
113@item -L @var{directory}
114Add @var{directory} to the front of Guile's module load path. The
115given directories are searched in the order given on the command line
116and before any directories in the GUILE_LOAD_PATH environment
117variable. Paths added here are @emph{not} in effect during execution
118of the user's @file{.guile} file.
119
07d83abe
MV
120@item -l @var{file}
121Load Scheme source code from @var{file}, and continue processing the
122command line.
123
124@item -e @var{function}
125Make @var{function} the @dfn{entry point} of the script. After loading
126the script file (with @code{-s}) or evaluating the expression (with
127@code{-c}), apply @var{function} to a list containing the program name
128and the command-line arguments --- the list provided by the
129@code{command-line} function.
130
131A @code{-e} switch can appear anywhere in the argument list, but Guile
132always invokes the @var{function} as the @emph{last} action it performs.
133This is weird, but because of the way script invocation works under
134POSIX, the @code{-s} option must always come last in the list.
135
136The @var{function} is most often a simple symbol that names a function
137that is defined in the script. It can also be of the form @code{(@@
138@var{module-name} @var{symbol})} and in that case, the symbol is
139looked up in the module named @var{module-name}.
140
e70c841f
MV
141For compatibility with some versions of Guile 1.4, you can also use the
142form @code{(symbol ...)} (that is, a list of only symbols that doesn't
143start with @code{@@}), which is equivalent to @code{(@@ (symbol ...)
144main)}, or @code{(symbol ...) symbol} (that is, a list of only symbols
145followed by a symbol), which is equivalent to @code{(@@ (symbol ...)
146symbol)}. We recommend to use the equivalent forms directly since they
147corresponf to the @code{(@@ ...)} read syntax that can be used in
148normal code, @xref{Using Guile Modules}.
149
07d83abe
MV
150@xref{Scripting Examples}.
151
152@item -ds
153Treat a final @code{-s} option as if it occurred at this point in the
154command line; load the script here.
155
156This switch is necessary because, although the POSIX script invocation
157mechanism effectively requires the @code{-s} option to appear last, the
158programmer may well want to run the script before other actions
159requested on the command line. For examples, see @ref{Scripting
160Examples}.
161
162@item \
163Read more command-line arguments, starting from the second line of the
164script file. @xref{The Meta Switch}.
165
166@item --emacs
167Assume Guile is running as an inferior process of Emacs, and use a
168special protocol to communicate with Emacs's Guile interaction mode.
169This switch sets the global variable use-emacs-interface to @code{#t}.
170
171This switch is still experimental.
172
173@item --use-srfi=@var{list}
174The option @code{--use-srfi} expects a comma-separated list of numbers,
175each representing a SRFI number to be loaded into the interpreter
176before starting evaluating a script file or the REPL. Additionally,
177the feature identifier for the loaded SRFIs is recognized by
178`cond-expand' when using this option.
179
180@example
181guile --use-srfi=8,13
182@end example
183
184@item --debug
185Start with the debugging evaluator and enable backtraces. Using the
186debugging evaluator will give you better error messages but it will
187slow down execution. By default, the debugging evaluator is only used
188when entering an interactive session. When executing a script with
189@code{-s} or @code{-c}, the normal, faster evaluator is used by default.
190
191@vnew{1.8}
192@item --no-debug
193Do not use the debugging evaluator, even when entering an interactive
194session.
195
196@item -h@r{, }--help
197Display help on invoking Guile, and then exit.
198
199@item -v@r{, }--version
200Display the current version of Guile, and then exit.
201
202@end table
203
204
205@node The Meta Switch
206@subsection The Meta Switch
207
208Guile's command-line switches allow the programmer to describe
209reasonably complicated actions in scripts. Unfortunately, the POSIX
210script invocation mechanism only allows one argument to appear on the
211@samp{#!} line after the path to the Guile executable, and imposes
212arbitrary limits on that argument's length. Suppose you wrote a script
213starting like this:
214@example
215#!/usr/local/bin/guile -e main -s
216!#
217(define (main args)
218 (map (lambda (arg) (display arg) (display " "))
219 (cdr args))
220 (newline))
221@end example
222The intended meaning is clear: load the file, and then call @code{main}
223on the command-line arguments. However, the system will treat
224everything after the Guile path as a single argument --- the string
225@code{"-e main -s"} --- which is not what we want.
226
227As a workaround, the meta switch @code{\} allows the Guile programmer to
228specify an arbitrary number of options without patching the kernel. If
229the first argument to Guile is @code{\}, Guile will open the script file
230whose name follows the @code{\}, parse arguments starting from the
231file's second line (according to rules described below), and substitute
232them for the @code{\} switch.
233
234Working in concert with the meta switch, Guile treats the characters
235@samp{#!} as the beginning of a comment which extends through the next
236line containing only the characters @samp{!#}. This sort of comment may
237appear anywhere in a Guile program, but it is most useful at the top of
238a file, meshing magically with the POSIX script invocation mechanism.
239
240Thus, consider a script named @file{/u/jimb/ekko} which starts like this:
241@example
242#!/usr/local/bin/guile \
243-e main -s
244!#
245(define (main args)
246 (map (lambda (arg) (display arg) (display " "))
247 (cdr args))
248 (newline))
249@end example
250
251Suppose a user invokes this script as follows:
252@example
253$ /u/jimb/ekko a b c
254@end example
255
256Here's what happens:
257@itemize @bullet
258
259@item
260the operating system recognizes the @samp{#!} token at the top of the
261file, and rewrites the command line to:
262@example
263/usr/local/bin/guile \ /u/jimb/ekko a b c
264@end example
265This is the usual behavior, prescribed by POSIX.
266
267@item
268When Guile sees the first two arguments, @code{\ /u/jimb/ekko}, it opens
269@file{/u/jimb/ekko}, parses the three arguments @code{-e}, @code{main},
270and @code{-s} from it, and substitutes them for the @code{\} switch.
271Thus, Guile's command line now reads:
272@example
273/usr/local/bin/guile -e main -s /u/jimb/ekko a b c
274@end example
275
276@item
277Guile then processes these switches: it loads @file{/u/jimb/ekko} as a
278file of Scheme code (treating the first three lines as a comment), and
279then performs the application @code{(main "/u/jimb/ekko" "a" "b" "c")}.
280
281@end itemize
282
283
284When Guile sees the meta switch @code{\}, it parses command-line
285argument from the script file according to the following rules:
286@itemize @bullet
287
288@item
289Each space character terminates an argument. This means that two
290spaces in a row introduce an argument @code{""}.
291
292@item
293The tab character is not permitted (unless you quote it with the
294backslash character, as described below), to avoid confusion.
295
296@item
297The newline character terminates the sequence of arguments, and will
298also terminate a final non-empty argument. (However, a newline
299following a space will not introduce a final empty-string argument;
300it only terminates the argument list.)
301
302@item
303The backslash character is the escape character. It escapes backslash,
304space, tab, and newline. The ANSI C escape sequences like @code{\n} and
305@code{\t} are also supported. These produce argument constituents; the
306two-character combination @code{\n} doesn't act like a terminating
307newline. The escape sequence @code{\@var{NNN}} for exactly three octal
308digits reads as the character whose ASCII code is @var{NNN}. As above,
309characters produced this way are argument constituents. Backslash
310followed by other characters is not allowed.
311
312@end itemize
313
314
315@node Command Line Handling
316@subsection Command Line Handling
317
318@c This section was written and contributed by Martin Grabmueller.
319
320The ability to accept and handle command line arguments is very
321important when writing Guile scripts to solve particular problems, such
322as extracting information from text files or interfacing with existing
323command line applications. This chapter describes how Guile makes
324command line arguments available to a Guile script, and the utilities
325that Guile provides to help with the processing of command line
326arguments.
327
328When a Guile script is invoked, Guile makes the command line arguments
329accessible via the procedure @code{command-line}, which returns the
330arguments as a list of strings.
331
332For example, if the script
333
334@example
335#! /usr/local/bin/guile -s
336!#
337(write (command-line))
338(newline)
339@end example
340
341@noindent
342is saved in a file @file{cmdline-test.scm} and invoked using the command
343line @code{./cmdline-test.scm bar.txt -o foo -frumple grob}, the output
344is
345
346@example
347("./cmdline-test.scm" "bar.txt" "-o" "foo" "-frumple" "grob")
348@end example
349
350If the script invocation includes a @code{-e} option, specifying a
351procedure to call after loading the script, Guile will call that
352procedure with @code{(command-line)} as its argument. So a script that
353uses @code{-e} doesn't need to refer explicitly to @code{command-line}
354in its code. For example, the script above would have identical
355behaviour if it was written instead like this:
356
357@example
358#! /usr/local/bin/guile \
359-e main -s
360!#
361(define (main args)
362 (write args)
363 (newline))
364@end example
365
366(Note the use of the meta switch @code{\} so that the script invocation
367can include more than one Guile option: @xref{The Meta Switch}.)
368
369These scripts use the @code{#!} POSIX convention so that they can be
370executed using their own file names directly, as in the example command
371line @code{./cmdline-test.scm bar.txt -o foo -frumple grob}. But they
372can also be executed by typing out the implied Guile command line in
373full, as in:
374
375@example
376$ guile -s ./cmdline-test.scm bar.txt -o foo -frumple grob
377@end example
378
379@noindent
380or
381
382@example
383$ guile -e main -s ./cmdline-test2.scm bar.txt -o foo -frumple grob
384@end example
385
386Even when a script is invoked using this longer form, the arguments that
387the script receives are the same as if it had been invoked using the
388short form. Guile ensures that the @code{(command-line)} or @code{-e}
389arguments are independent of how the script is invoked, by stripping off
390the arguments that Guile itself processes.
391
392A script is free to parse and handle its command line arguments in any
393way that it chooses. Where the set of possible options and arguments is
394complex, however, it can get tricky to extract all the options, check
395the validity of given arguments, and so on. This task can be greatly
396simplified by taking advantage of the module @code{(ice-9 getopt-long)},
397which is distributed with Guile, @xref{getopt-long}.
398
399
400@node Scripting Examples
401@subsection Scripting Examples
402
403To start with, here are some examples of invoking Guile directly:
404
405@table @code
406
407@item guile -- a b c
408Run Guile interactively; @code{(command-line)} will return @*
409@code{("/usr/local/bin/guile" "a" "b" "c")}.
410
411@item guile -s /u/jimb/ex2 a b c
412Load the file @file{/u/jimb/ex2}; @code{(command-line)} will return @*
413@code{("/u/jimb/ex2" "a" "b" "c")}.
414
415@item guile -c '(write %load-path) (newline)'
416Write the value of the variable @code{%load-path}, print a newline,
417and exit.
418
419@item guile -e main -s /u/jimb/ex4 foo
420Load the file @file{/u/jimb/ex4}, and then call the function
421@code{main}, passing it the list @code{("/u/jimb/ex4" "foo")}.
422
423@item guile -l first -ds -l last -s script
424Load the files @file{first}, @file{script}, and @file{last}, in that
425order. The @code{-ds} switch says when to process the @code{-s}
426switch. For a more motivated example, see the scripts below.
427
428@end table
429
430
431Here is a very simple Guile script:
432@example
433#!/usr/local/bin/guile -s
434!#
435(display "Hello, world!")
436(newline)
437@end example
438The first line marks the file as a Guile script. When the user invokes
439it, the system runs @file{/usr/local/bin/guile} to interpret the script,
440passing @code{-s}, the script's filename, and any arguments given to the
441script as command-line arguments. When Guile sees @code{-s
442@var{script}}, it loads @var{script}. Thus, running this program
443produces the output:
444@example
445Hello, world!
446@end example
447
448Here is a script which prints the factorial of its argument:
449@example
450#!/usr/local/bin/guile -s
451!#
452(define (fact n)
453 (if (zero? n) 1
454 (* n (fact (- n 1)))))
455
456(display (fact (string->number (cadr (command-line)))))
457(newline)
458@end example
459In action:
460@example
461$ fact 5
462120
463$
464@end example
465
466However, suppose we want to use the definition of @code{fact} in this
467file from another script. We can't simply @code{load} the script file,
468and then use @code{fact}'s definition, because the script will try to
469compute and display a factorial when we load it. To avoid this problem,
470we might write the script this way:
471
472@example
473#!/usr/local/bin/guile \
474-e main -s
475!#
476(define (fact n)
477 (if (zero? n) 1
478 (* n (fact (- n 1)))))
479
480(define (main args)
481 (display (fact (string->number (cadr args))))
482 (newline))
483@end example
484This version packages the actions the script should perform in a
485function, @code{main}. This allows us to load the file purely for its
486definitions, without any extraneous computation taking place. Then we
487used the meta switch @code{\} and the entry point switch @code{-e} to
488tell Guile to call @code{main} after loading the script.
489@example
490$ fact 50
49130414093201713378043612608166064768844377641568960512000000000000
492@end example
493
494Suppose that we now want to write a script which computes the
495@code{choose} function: given a set of @var{m} distinct objects,
496@code{(choose @var{n} @var{m})} is the number of distinct subsets
497containing @var{n} objects each. It's easy to write @code{choose} given
498@code{fact}, so we might write the script this way:
499@example
500#!/usr/local/bin/guile \
501-l fact -e main -s
502!#
503(define (choose n m)
504 (/ (fact m) (* (fact (- m n)) (fact n))))
505
506(define (main args)
507 (let ((n (string->number (cadr args)))
508 (m (string->number (caddr args))))
509 (display (choose n m))
510 (newline)))
511@end example
512
513The command-line arguments here tell Guile to first load the file
514@file{fact}, and then run the script, with @code{main} as the entry
515point. In other words, the @code{choose} script can use definitions
516made in the @code{fact} script. Here are some sample runs:
517@example
518$ choose 0 4
5191
520$ choose 1 4
5214
522$ choose 2 4
5236
524$ choose 3 4
5254
526$ choose 4 4
5271
528$ choose 50 100
529100891344545564193334812497256
530@end example
531
44fd0a72
KR
532
533@c Local Variables:
534@c TeX-master: "guile.texi"
535@c End: