* backtrace.c: Introduced exception handlers which now enclose
[bpt/guile.git] / NEWS
CommitLineData
f7b47737
JB
1Guile NEWS --- history of user-visible changes. -*- text -*-
2Copyright (C) 1996, 1997 Free Software Foundation, Inc.
5c54da76
JB
3See the end for copying conditions.
4
16f2ebea 5Please send Guile bug reports to bug-guile@prep.ai.mit.edu.
5c54da76 6\f
c484bf7f
JB
7Changes since Guile 1.2:
8
9* Changes to the distribution
10
3a97e020
MD
11** libguile/append.h, libguile/append.c, libguile/sequences.h,
12libguile/sequences.c removed.
13
c484bf7f
JB
14* Changes to the stand-alone interpreter
15
16* Changes to the procedure for linking libguile with your programs
17
18* Changes to Scheme functions and syntax
7ad3c1e7 19
9c3fb66f
MV
20** The detection of circular references has been extended to structs.
21That is, a structure that -- in the process of being printed -- prints
22itself does not lead to infinite recursion.
23
04c76b58
MV
24** There is now some basic support for fluids. Please read
25"libguile/fluid.h" to find out more. It is accessible from Scheme with
9c3fb66f
MV
26the following functions and macros:
27
28Function: make-fluid
29
30 Create a new fluid object. Fluids are not special variables or
31 some other extension to the semantics of Scheme, but rather
32 ordinary Scheme objects. You can store them into variables (that
33 are still lexically scoped, of course) or into any other place you
34 like. Every fluid has a initial value of `#f'.
04c76b58 35
9c3fb66f 36Function: fluid? OBJ
04c76b58 37
9c3fb66f 38 Test whether OBJ is a fluid.
04c76b58 39
9c3fb66f
MV
40Function: fluid-ref FLUID
41Function: fluid-set! FLUID VAL
04c76b58
MV
42
43 Access/modify the fluid FLUID. Modifications are only visible
44 within the current dynamic root (that includes threads).
45
9c3fb66f
MV
46Function: with-fluids* FLUIDS VALUES THUNK
47
48 FLUIDS is a list of fluids and VALUES a corresponding list of
49 values for these fluids. Before THUNK gets called the values are
50 installed in the fluids and the old values of the fluids are
51 saved in the VALUES list. When the flow of control leaves THUNK
52 or reenters it, the values get swapped again. You might think of
53 this as a `safe-fluid-excursion'. Note that the VALUES list is
54 modified by `with-fluids*'.
55
56Macro: with-fluids ((FLUID VALUE) ...) FORM ...
57
58 The same as `with-fluids*' but with a different syntax. It looks
59 just like `let', but both FLUID and VALUE are evaluated. Remember,
60 fluids are not special variables but ordinary objects. FLUID
61 should evaluate to a fluid.
04c76b58 62
3a97e020
MD
63** Removed procedures:
64
65list-length, list-append, list-append!, list-reverse, list-reverse!
66
64d01d13
GH
67* Changes to system call interfaces:
68
69** close-port, close-input-port and close-output-port now return a
70boolean instead of an `unspecified' object. #t means that the port
71was successfully closed, while #f means it was already closed. It is
72also now possible for these procedures to raise an exception if an
73error occurs (some errors from write can be delayed until close.)
74
6afcd3b2
GH
75** the first argument to chmod, fcntl, ftell and fseek can now be a
76file descriptor.
77
78** the third argument to fcntl is now optional.
79
80** the first argument to chown can now be a file descriptor or a port.
81
82** the argument to stat can now be a port.
83
64d01d13
GH
84** The following new procedures have been added (most use scsh
85interfaces):
86
87** close PORT/FD
88Similar to close-port, but also works on file descriptors. A side
89effect of closing a file descriptor is that any ports using that file
90descriptor are moved to a different file descriptor and have
91their revealed counts set to zero.
92
93The next five procedures perform a dup2 system call, if NEWFD (an
94integer) is supplied, otherwise a dup. The file descriptor to be
95duplicated can be supplied as an integer or wrapped in a port. The
96type of value returned varies depending on which procedure is used.
97
98All procedures also have the side effect when performing dup2 that any
99ports using NEWFD are moved to a different file descriptor and have
100their revealed counts set to zero.
101
102** dup->fdes PORT/FD [NEWFD]
103Returns an integer file descriptor.
104
105** dup->inport PORT/FD [NEWFD]
106Returns a new input port using the new file descriptor.
107
108** dup->outport PORT/FD [NEWFD]
109Returns a new output port using the new file descriptor.
110
111** dup PORT/FD [NEWFD]
112Returns a new port if PORT/FD is a port, with the same mode as the
113supplied port, otherwise returns an integer file descriptor.
114
115** dup->port PORT/FD MODE [NEWFD]
116Returns a new port using the new file descriptor. MODE supplies a
117mode string for the port (as for `open-file').
118
64d01d13
GH
119** port->fdes PORT
120Returns the integer file descriptor underlying PORT. As a
121side effect the revealed count of PORT is incremented.
122
123** fdes->inport FDES
124Returns an existing input port which has FDES as its underlying file
125descriptor, if one exists, and increments its revealed count.
126Otherwise, returns a new input port with a revealed count of 1.
127
128** fdes->outport FDES
129Returns an existing output port which has FDES as its underlying file
130descriptor, if one exists, and increments its revealed count.
131Otherwise, returns a new output port with a revealed count of 1.
132
7a6f1ffa 133** setenv NAME VALUE
956055a9
GH
134If VALUE is `#f', removes NAME from the environment. Otherwise
135adds the string NAME=VALUE to the environment, replacing any previous
136value for NAME.
137
6afcd3b2
GH
138** truncate-file OBJ SIZE
139 Truncates the file referred to by OBJ to at most SIZE bytes. OBJ
140 can be a string containing a file name or an integer file
141 descriptor or port open for output on the file. The underlying
142 system calls are `truncate' and `ftruncate'.
143
144 The return value is unspecified.
145
7a6f1ffa
GH
146** setvbuf PORT MODE [SIZE]
147 Set the buffering mode for PORT. MODE can be:
148 `_IONBF'
149 non-buffered
150
151 `_IOLBF'
152 line buffered
153
154 `_IOFBF'
155 block buffered, using a newly allocated buffer of SIZE bytes.
156 However if SIZE is zero or unspecified, the port will be made
157 non-buffered.
158
159 This procedure should not be used after I/O has been performed with
160 the port.
161
162 Ports are usually block buffered by default, with a default buffer
163 size. Procedures e.g., *Note open-file: File Ports, which accept a
164 mode string allow `0' to be added to request an unbuffered port.
165
6afcd3b2
GH
166** fsync PORT/FD
167 Copies any unwritten data for the specified output file descriptor
168 to disk. If PORT/FD is a port, its buffer is flushed before the
169 underlying file descriptor is fsync'd. The return value is
170 unspecified.
171
172** open-fdes PATH FLAGS [MODES]
173 Similar to `open' but returns a file descriptor instead of a port.
174
175** procedure: execle PATH ENV [ARG] ...
176 Similar to `execl', but the environment of the new process is
177 specified by ENV, which must be a list of strings as returned by
178 the `environ' procedure.
179
180 This procedure is currently implemented using the `execve' system
181 call, but we call it `execle' because of its Scheme calling
182 interface.
183
184** procedure: primitive-exit [STATUS]
185 Terminate the current process without unwinding the Scheme stack.
186 This is would typically be useful after a fork. The exit status
187 is STATUS if supplied, otherwise zero.
188
189** procedure: times
190 Returns an object with information about real and processor time.
191 The following procedures accept such an object as an argument and
192 return a selected component:
193
194 `tms:clock'
195 The current real time, expressed as time units relative to an
196 arbitrary base.
197
198 `tms:utime'
199 The CPU time units used by the calling process.
200
201 `tms:stime'
202 The CPU time units used by the system on behalf of the
203 calling process.
204
205 `tms:cutime'
206 The CPU time units used by terminated child processes of the
207 calling process, whose status has been collected (e.g., using
208 `waitpid').
209
210 `tms:cstime'
211 Similarly, the CPU times units used by the system on behalf of
212 terminated child processes.
7ad3c1e7 213
c484bf7f
JB
214* Changes to the gh_ interface
215
5424b4f7
MD
216** Function: void gh_write (SCM x)
217
218Write the printed representation of the scheme object x to the current
219output port. Corresponds to the scheme level `write'.
220
3a97e020
MD
221** gh_list_length renamed to gh_length.
222
c484bf7f
JB
223* Changes to the scm_ interface
224
5424b4f7
MD
225** Function: SCM scm_internal_stack_catch (SCM tag,
226 scm_catch_body_t body,
227 void *body_data,
228 scm_catch_handler_t handler,
229 void *handler_data)
230
231A new sibling to the other two C level `catch' functions
232scm_internal_catch and scm_internal_lazy_catch. Use it if you want
233the stack to be saved automatically into the variable `the-last-stack'
234(scm_the_last_stack_var) on error. This is necessary if you want to
235use advanced error reporting, such as calling scm_display_error and
236scm_display_backtrace. (They both take a stack object as argument.)
237
88482b31
MD
238** The hook scm_error_callback has been removed. It was originally
239intended as a way for the user to install his own error handler. But
240that method works badly since it intervenes between throw and catch,
241thereby changing the semantics of expressions like (catch #t ...).
242The correct way to do it is to use one of the C level catch functions
243in throw.c: scm_internal_catch/lazy_catch/stack_catch.
244
3a97e020
MD
245** Removed functions:
246
247scm_obj_length, scm_list_length, scm_list_append, scm_list_append_x,
248scm_list_reverse, scm_list_reverse_x
249
250** New macros: SCM_LISTn where n is one of the integers 0-9.
251
252These can be used for pretty list creation from C. The idea is taken
253from Erick Gallesio's STk.
254
c484bf7f
JB
255\f
256Changes in Guile 1.2 (released Tuesday, June 24 1997):
cf78e9e8 257
737c9113
JB
258* Changes to the distribution
259
832b09ed
JB
260** Nightly snapshots are now available from ftp.red-bean.com.
261The old server, ftp.cyclic.com, has been relinquished to its rightful
262owner.
263
264Nightly snapshots of the Guile development sources are now available via
265anonymous FTP from ftp.red-bean.com, as /pub/guile/guile-snap.tar.gz.
266
267Via the web, that's: ftp://ftp.red-bean.com/pub/guile/guile-snap.tar.gz
268For getit, that's: ftp.red-bean.com:/pub/guile/guile-snap.tar.gz
269
0fcab5ed
JB
270** To run Guile without installing it, the procedure has changed a bit.
271
272If you used a separate build directory to compile Guile, you'll need
273to include the build directory in SCHEME_LOAD_PATH, as well as the
274source directory. See the `INSTALL' file for examples.
275
737c9113
JB
276* Changes to the procedure for linking libguile with your programs
277
94982a4e
JB
278** The standard Guile load path for Scheme code now includes
279$(datadir)/guile (usually /usr/local/share/guile). This means that
280you can install your own Scheme files there, and Guile will find them.
281(Previous versions of Guile only checked a directory whose name
282contained the Guile version number, so you had to re-install or move
283your Scheme sources each time you installed a fresh version of Guile.)
284
285The load path also includes $(datadir)/guile/site; we recommend
286putting individual Scheme files there. If you want to install a
287package with multiple source files, create a directory for them under
288$(datadir)/guile.
289
290** Guile 1.2 will now use the Rx regular expression library, if it is
291installed on your system. When you are linking libguile into your own
292programs, this means you will have to link against -lguile, -lqt (if
293you configured Guile with thread support), and -lrx.
27590f82
JB
294
295If you are using autoconf to generate configuration scripts for your
296application, the following lines should suffice to add the appropriate
297libraries to your link command:
298
299### Find Rx, quickthreads and libguile.
300AC_CHECK_LIB(rx, main)
301AC_CHECK_LIB(qt, main)
302AC_CHECK_LIB(guile, scm_shell)
303
94982a4e
JB
304The Guile 1.2 distribution does not contain sources for the Rx
305library, as Guile 1.0 did. If you want to use Rx, you'll need to
306retrieve it from a GNU FTP site and install it separately.
307
b83b8bee
JB
308* Changes to Scheme functions and syntax
309
e035e7e6
MV
310** The dynamic linking features of Guile are now enabled by default.
311You can disable them by giving the `--disable-dynamic-linking' option
312to configure.
313
e035e7e6
MV
314 (dynamic-link FILENAME)
315
316 Find the object file denoted by FILENAME (a string) and link it
317 into the running Guile application. When everything works out,
318 return a Scheme object suitable for representing the linked object
319 file. Otherwise an error is thrown. How object files are
320 searched is system dependent.
321
322 (dynamic-object? VAL)
323
324 Determine whether VAL represents a dynamically linked object file.
325
326 (dynamic-unlink DYNOBJ)
327
328 Unlink the indicated object file from the application. DYNOBJ
329 should be one of the values returned by `dynamic-link'.
330
331 (dynamic-func FUNCTION DYNOBJ)
332
333 Search the C function indicated by FUNCTION (a string or symbol)
334 in DYNOBJ and return some Scheme object that can later be used
335 with `dynamic-call' to actually call this function. Right now,
336 these Scheme objects are formed by casting the address of the
337 function to `long' and converting this number to its Scheme
338 representation.
339
340 (dynamic-call FUNCTION DYNOBJ)
341
342 Call the C function indicated by FUNCTION and DYNOBJ. The
343 function is passed no arguments and its return value is ignored.
344 When FUNCTION is something returned by `dynamic-func', call that
345 function and ignore DYNOBJ. When FUNCTION is a string (or symbol,
346 etc.), look it up in DYNOBJ; this is equivalent to
347
348 (dynamic-call (dynamic-func FUNCTION DYNOBJ) #f)
349
350 Interrupts are deferred while the C function is executing (with
351 SCM_DEFER_INTS/SCM_ALLOW_INTS).
352
353 (dynamic-args-call FUNCTION DYNOBJ ARGS)
354
355 Call the C function indicated by FUNCTION and DYNOBJ, but pass it
356 some arguments and return its return value. The C function is
357 expected to take two arguments and return an `int', just like
358 `main':
359
360 int c_func (int argc, char **argv);
361
362 ARGS must be a list of strings and is converted into an array of
363 `char *'. The array is passed in ARGV and its size in ARGC. The
364 return value is converted to a Scheme number and returned from the
365 call to `dynamic-args-call'.
366
0fcab5ed
JB
367When dynamic linking is disabled or not supported on your system,
368the above functions throw errors, but they are still available.
369
e035e7e6
MV
370Here is a small example that works on GNU/Linux:
371
372 (define libc-obj (dynamic-link "libc.so"))
373 (dynamic-args-call 'rand libc-obj '())
374
375See the file `libguile/DYNAMIC-LINKING' for additional comments.
376
27590f82
JB
377** The #/ syntax for module names is depreciated, and will be removed
378in a future version of Guile. Instead of
379
380 #/foo/bar/baz
381
382instead write
383
384 (foo bar baz)
385
386The latter syntax is more consistent with existing Lisp practice.
387
5dade857
MV
388** Guile now does fancier printing of structures. Structures are the
389underlying implementation for records, which in turn are used to
390implement modules, so all of these object now print differently and in
391a more informative way.
392
161029df
JB
393The Scheme printer will examine the builtin variable *struct-printer*
394whenever it needs to print a structure object. When this variable is
395not `#f' it is deemed to be a procedure and will be applied to the
396structure object and the output port. When *struct-printer* is `#f'
397or the procedure return `#f' the structure object will be printed in
398the boring #<struct 80458270> form.
5dade857
MV
399
400This hook is used by some routines in ice-9/boot-9.scm to implement
401type specific printing routines. Please read the comments there about
402"printing structs".
403
404One of the more specific uses of structs are records. The printing
405procedure that could be passed to MAKE-RECORD-TYPE is now actually
406called. It should behave like a *struct-printer* procedure (described
407above).
408
b83b8bee
JB
409** Guile now supports a new R4RS-compliant syntax for keywords. A
410token of the form #:NAME, where NAME has the same syntax as a Scheme
411symbol, is the external representation of the keyword named NAME.
412Keyword objects print using this syntax as well, so values containing
1e5afba0
JB
413keyword objects can be read back into Guile. When used in an
414expression, keywords are self-quoting objects.
b83b8bee
JB
415
416Guile suports this read syntax, and uses this print syntax, regardless
417of the current setting of the `keyword' read option. The `keyword'
418read option only controls whether Guile recognizes the `:NAME' syntax,
419which is incompatible with R4RS. (R4RS says such token represent
420symbols.)
737c9113
JB
421
422** Guile has regular expression support again. Guile 1.0 included
423functions for matching regular expressions, based on the Rx library.
424In Guile 1.1, the Guile/Rx interface was removed to simplify the
425distribution, and thus Guile had no regular expression support. Guile
94982a4e
JB
4261.2 again supports the most commonly used functions, and supports all
427of SCSH's regular expression functions.
2409cdfa 428
94982a4e
JB
429If your system does not include a POSIX regular expression library,
430and you have not linked Guile with a third-party regexp library such as
431Rx, these functions will not be available. You can tell whether your
432Guile installation includes regular expression support by checking
433whether the `*features*' list includes the `regex' symbol.
737c9113 434
94982a4e 435*** regexp functions
161029df 436
94982a4e
JB
437By default, Guile supports POSIX extended regular expressions. That
438means that the characters `(', `)', `+' and `?' are special, and must
439be escaped if you wish to match the literal characters.
e1a191a8 440
94982a4e
JB
441This regular expression interface was modeled after that implemented
442by SCSH, the Scheme Shell. It is intended to be upwardly compatible
443with SCSH regular expressions.
444
445**** Function: string-match PATTERN STR [START]
446 Compile the string PATTERN into a regular expression and compare
447 it with STR. The optional numeric argument START specifies the
448 position of STR at which to begin matching.
449
450 `string-match' returns a "match structure" which describes what,
451 if anything, was matched by the regular expression. *Note Match
452 Structures::. If STR does not match PATTERN at all,
453 `string-match' returns `#f'.
454
455 Each time `string-match' is called, it must compile its PATTERN
456argument into a regular expression structure. This operation is
457expensive, which makes `string-match' inefficient if the same regular
458expression is used several times (for example, in a loop). For better
459performance, you can compile a regular expression in advance and then
460match strings against the compiled regexp.
461
462**** Function: make-regexp STR [FLAGS]
463 Compile the regular expression described by STR, and return the
464 compiled regexp structure. If STR does not describe a legal
465 regular expression, `make-regexp' throws a
466 `regular-expression-syntax' error.
467
468 FLAGS may be the bitwise-or of one or more of the following:
469
470**** Constant: regexp/extended
471 Use POSIX Extended Regular Expression syntax when interpreting
472 STR. If not set, POSIX Basic Regular Expression syntax is used.
473 If the FLAGS argument is omitted, we assume regexp/extended.
474
475**** Constant: regexp/icase
476 Do not differentiate case. Subsequent searches using the
477 returned regular expression will be case insensitive.
478
479**** Constant: regexp/newline
480 Match-any-character operators don't match a newline.
481
482 A non-matching list ([^...]) not containing a newline matches a
483 newline.
484
485 Match-beginning-of-line operator (^) matches the empty string
486 immediately after a newline, regardless of whether the FLAGS
487 passed to regexp-exec contain regexp/notbol.
488
489 Match-end-of-line operator ($) matches the empty string
490 immediately before a newline, regardless of whether the FLAGS
491 passed to regexp-exec contain regexp/noteol.
492
493**** Function: regexp-exec REGEXP STR [START [FLAGS]]
494 Match the compiled regular expression REGEXP against `str'. If
495 the optional integer START argument is provided, begin matching
496 from that position in the string. Return a match structure
497 describing the results of the match, or `#f' if no match could be
498 found.
499
500 FLAGS may be the bitwise-or of one or more of the following:
501
502**** Constant: regexp/notbol
503 The match-beginning-of-line operator always fails to match (but
504 see the compilation flag regexp/newline above) This flag may be
505 used when different portions of a string are passed to
506 regexp-exec and the beginning of the string should not be
507 interpreted as the beginning of the line.
508
509**** Constant: regexp/noteol
510 The match-end-of-line operator always fails to match (but see the
511 compilation flag regexp/newline above)
512
513**** Function: regexp? OBJ
514 Return `#t' if OBJ is a compiled regular expression, or `#f'
515 otherwise.
516
517 Regular expressions are commonly used to find patterns in one string
518and replace them with the contents of another string.
519
520**** Function: regexp-substitute PORT MATCH [ITEM...]
521 Write to the output port PORT selected contents of the match
522 structure MATCH. Each ITEM specifies what should be written, and
523 may be one of the following arguments:
524
525 * A string. String arguments are written out verbatim.
526
527 * An integer. The submatch with that number is written.
528
529 * The symbol `pre'. The portion of the matched string preceding
530 the regexp match is written.
531
532 * The symbol `post'. The portion of the matched string
533 following the regexp match is written.
534
535 PORT may be `#f', in which case nothing is written; instead,
536 `regexp-substitute' constructs a string from the specified ITEMs
537 and returns that.
538
539**** Function: regexp-substitute/global PORT REGEXP TARGET [ITEM...]
540 Similar to `regexp-substitute', but can be used to perform global
541 substitutions on STR. Instead of taking a match structure as an
542 argument, `regexp-substitute/global' takes two string arguments: a
543 REGEXP string describing a regular expression, and a TARGET string
544 which should be matched against this regular expression.
545
546 Each ITEM behaves as in REGEXP-SUBSTITUTE, with the following
547 exceptions:
548
549 * A function may be supplied. When this function is called, it
550 will be passed one argument: a match structure for a given
551 regular expression match. It should return a string to be
552 written out to PORT.
553
554 * The `post' symbol causes `regexp-substitute/global' to recurse
555 on the unmatched portion of STR. This *must* be supplied in
556 order to perform global search-and-replace on STR; if it is
557 not present among the ITEMs, then `regexp-substitute/global'
558 will return after processing a single match.
559
560*** Match Structures
561
562 A "match structure" is the object returned by `string-match' and
563`regexp-exec'. It describes which portion of a string, if any, matched
564the given regular expression. Match structures include: a reference to
565the string that was checked for matches; the starting and ending
566positions of the regexp match; and, if the regexp included any
567parenthesized subexpressions, the starting and ending positions of each
568submatch.
569
570 In each of the regexp match functions described below, the `match'
571argument must be a match structure returned by a previous call to
572`string-match' or `regexp-exec'. Most of these functions return some
573information about the original target string that was matched against a
574regular expression; we will call that string TARGET for easy reference.
575
576**** Function: regexp-match? OBJ
577 Return `#t' if OBJ is a match structure returned by a previous
578 call to `regexp-exec', or `#f' otherwise.
579
580**** Function: match:substring MATCH [N]
581 Return the portion of TARGET matched by subexpression number N.
582 Submatch 0 (the default) represents the entire regexp match. If
583 the regular expression as a whole matched, but the subexpression
584 number N did not match, return `#f'.
585
586**** Function: match:start MATCH [N]
587 Return the starting position of submatch number N.
588
589**** Function: match:end MATCH [N]
590 Return the ending position of submatch number N.
591
592**** Function: match:prefix MATCH
593 Return the unmatched portion of TARGET preceding the regexp match.
594
595**** Function: match:suffix MATCH
596 Return the unmatched portion of TARGET following the regexp match.
597
598**** Function: match:count MATCH
599 Return the number of parenthesized subexpressions from MATCH.
600 Note that the entire regular expression match itself counts as a
601 subexpression, and failed submatches are included in the count.
602
603**** Function: match:string MATCH
604 Return the original TARGET string.
605
606*** Backslash Escapes
607
608 Sometimes you will want a regexp to match characters like `*' or `$'
609exactly. For example, to check whether a particular string represents
610a menu entry from an Info node, it would be useful to match it against
611a regexp like `^* [^:]*::'. However, this won't work; because the
612asterisk is a metacharacter, it won't match the `*' at the beginning of
613the string. In this case, we want to make the first asterisk un-magic.
614
615 You can do this by preceding the metacharacter with a backslash
616character `\'. (This is also called "quoting" the metacharacter, and
617is known as a "backslash escape".) When Guile sees a backslash in a
618regular expression, it considers the following glyph to be an ordinary
619character, no matter what special meaning it would ordinarily have.
620Therefore, we can make the above example work by changing the regexp to
621`^\* [^:]*::'. The `\*' sequence tells the regular expression engine
622to match only a single asterisk in the target string.
623
624 Since the backslash is itself a metacharacter, you may force a
625regexp to match a backslash in the target string by preceding the
626backslash with itself. For example, to find variable references in a
627TeX program, you might want to find occurrences of the string `\let\'
628followed by any number of alphabetic characters. The regular expression
629`\\let\\[A-Za-z]*' would do this: the double backslashes in the regexp
630each match a single backslash in the target string.
631
632**** Function: regexp-quote STR
633 Quote each special character found in STR with a backslash, and
634 return the resulting string.
635
636 *Very important:* Using backslash escapes in Guile source code (as
637in Emacs Lisp or C) can be tricky, because the backslash character has
638special meaning for the Guile reader. For example, if Guile encounters
639the character sequence `\n' in the middle of a string while processing
640Scheme code, it replaces those characters with a newline character.
641Similarly, the character sequence `\t' is replaced by a horizontal tab.
642Several of these "escape sequences" are processed by the Guile reader
643before your code is executed. Unrecognized escape sequences are
644ignored: if the characters `\*' appear in a string, they will be
645translated to the single character `*'.
646
647 This translation is obviously undesirable for regular expressions,
648since we want to be able to include backslashes in a string in order to
649escape regexp metacharacters. Therefore, to make sure that a backslash
650is preserved in a string in your Guile program, you must use *two*
651consecutive backslashes:
652
653 (define Info-menu-entry-pattern (make-regexp "^\\* [^:]*"))
654
655 The string in this example is preprocessed by the Guile reader before
656any code is executed. The resulting argument to `make-regexp' is the
657string `^\* [^:]*', which is what we really want.
658
659 This also means that in order to write a regular expression that
660matches a single backslash character, the regular expression string in
661the source code must include *four* backslashes. Each consecutive pair
662of backslashes gets translated by the Guile reader to a single
663backslash, and the resulting double-backslash is interpreted by the
664regexp engine as matching a single backslash character. Hence:
665
666 (define tex-variable-pattern (make-regexp "\\\\let\\\\=[A-Za-z]*"))
667
668 The reason for the unwieldiness of this syntax is historical. Both
669regular expression pattern matchers and Unix string processing systems
670have traditionally used backslashes with the special meanings described
671above. The POSIX regular expression specification and ANSI C standard
672both require these semantics. Attempting to abandon either convention
673would cause other kinds of compatibility problems, possibly more severe
674ones. Therefore, without extending the Scheme reader to support
675strings with different quoting conventions (an ungainly and confusing
676extension when implemented in other languages), we must adhere to this
677cumbersome escape syntax.
678
7ad3c1e7
GH
679* Changes to the gh_ interface
680
681* Changes to the scm_ interface
682
683* Changes to system call interfaces:
94982a4e 684
7ad3c1e7 685** The value returned by `raise' is now unspecified. It throws an exception
e1a191a8
GH
686if an error occurs.
687
94982a4e 688*** A new procedure `sigaction' can be used to install signal handlers
115b09a5
GH
689
690(sigaction signum [action] [flags])
691
692signum is the signal number, which can be specified using the value
693of SIGINT etc.
694
695If action is omitted, sigaction returns a pair: the CAR is the current
696signal hander, which will be either an integer with the value SIG_DFL
697(default action) or SIG_IGN (ignore), or the Scheme procedure which
698handles the signal, or #f if a non-Scheme procedure handles the
699signal. The CDR contains the current sigaction flags for the handler.
700
701If action is provided, it is installed as the new handler for signum.
702action can be a Scheme procedure taking one argument, or the value of
703SIG_DFL (default action) or SIG_IGN (ignore), or #f to restore
704whatever signal handler was installed before sigaction was first used.
705Flags can optionally be specified for the new handler (SA_RESTART is
706always used if the system provides it, so need not be specified.) The
707return value is a pair with information about the old handler as
708described above.
709
710This interface does not provide access to the "signal blocking"
711facility. Maybe this is not needed, since the thread support may
712provide solutions to the problem of consistent access to data
713structures.
e1a191a8 714
94982a4e 715*** A new procedure `flush-all-ports' is equivalent to running
89ea5b7c
GH
716`force-output' on every port open for output.
717
94982a4e
JB
718** Guile now provides information on how it was built, via the new
719global variable, %guile-build-info. This variable records the values
720of the standard GNU makefile directory variables as an assocation
721list, mapping variable names (symbols) onto directory paths (strings).
722For example, to find out where the Guile link libraries were
723installed, you can say:
724
725guile -c "(display (assq-ref %guile-build-info 'libdir)) (newline)"
726
727
728* Changes to the scm_ interface
729
730** The new function scm_handle_by_message_noexit is just like the
731existing scm_handle_by_message function, except that it doesn't call
732exit to terminate the process. Instead, it prints a message and just
733returns #f. This might be a more appropriate catch-all handler for
734new dynamic roots and threads.
735
cf78e9e8 736\f
c484bf7f 737Changes in Guile 1.1 (released Friday, May 16 1997):
f3b1485f
JB
738
739* Changes to the distribution.
740
741The Guile 1.0 distribution has been split up into several smaller
742pieces:
743guile-core --- the Guile interpreter itself.
744guile-tcltk --- the interface between the Guile interpreter and
745 Tcl/Tk; Tcl is an interpreter for a stringy language, and Tk
746 is a toolkit for building graphical user interfaces.
747guile-rgx-ctax --- the interface between Guile and the Rx regular
748 expression matcher, and the translator for the Ctax
749 programming language. These are packaged together because the
750 Ctax translator uses Rx to parse Ctax source code.
751
095936d2
JB
752This NEWS file describes the changes made to guile-core since the 1.0
753release.
754
48d224d7
JB
755We no longer distribute the documentation, since it was either out of
756date, or incomplete. As soon as we have current documentation, we
757will distribute it.
758
0fcab5ed
JB
759
760
f3b1485f
JB
761* Changes to the stand-alone interpreter
762
48d224d7
JB
763** guile now accepts command-line arguments compatible with SCSH, Olin
764Shivers' Scheme Shell.
765
766In general, arguments are evaluated from left to right, but there are
767exceptions. The following switches stop argument processing, and
768stash all remaining command-line arguments as the value returned by
769the (command-line) function.
770 -s SCRIPT load Scheme source code from FILE, and exit
771 -c EXPR evalute Scheme expression EXPR, and exit
772 -- stop scanning arguments; run interactively
773
774The switches below are processed as they are encountered.
775 -l FILE load Scheme source code from FILE
776 -e FUNCTION after reading script, apply FUNCTION to
777 command line arguments
778 -ds do -s script at this point
779 --emacs enable Emacs protocol (experimental)
780 -h, --help display this help and exit
781 -v, --version display version information and exit
782 \ read arguments from following script lines
783
784So, for example, here is a Guile script named `ekko' (thanks, Olin)
785which re-implements the traditional "echo" command:
786
787#!/usr/local/bin/guile -s
788!#
789(define (main args)
790 (map (lambda (arg) (display arg) (display " "))
791 (cdr args))
792 (newline))
793
794(main (command-line))
795
796Suppose we invoke this script as follows:
797
798 ekko a speckled gecko
799
800Through the magic of Unix script processing (triggered by the `#!'
801token at the top of the file), /usr/local/bin/guile receives the
802following list of command-line arguments:
803
804 ("-s" "./ekko" "a" "speckled" "gecko")
805
806Unix inserts the name of the script after the argument specified on
807the first line of the file (in this case, "-s"), and then follows that
808with the arguments given to the script. Guile loads the script, which
809defines the `main' function, and then applies it to the list of
810remaining command-line arguments, ("a" "speckled" "gecko").
811
095936d2
JB
812In Unix, the first line of a script file must take the following form:
813
814#!INTERPRETER ARGUMENT
815
816where INTERPRETER is the absolute filename of the interpreter
817executable, and ARGUMENT is a single command-line argument to pass to
818the interpreter.
819
820You may only pass one argument to the interpreter, and its length is
821limited. These restrictions can be annoying to work around, so Guile
822provides a general mechanism (borrowed from, and compatible with,
823SCSH) for circumventing them.
824
825If the ARGUMENT in a Guile script is a single backslash character,
826`\', Guile will open the script file, parse arguments from its second
827and subsequent lines, and replace the `\' with them. So, for example,
828here is another implementation of the `ekko' script:
829
830#!/usr/local/bin/guile \
831-e main -s
832!#
833(define (main args)
834 (for-each (lambda (arg) (display arg) (display " "))
835 (cdr args))
836 (newline))
837
838If the user invokes this script as follows:
839
840 ekko a speckled gecko
841
842Unix expands this into
843
844 /usr/local/bin/guile \ ekko a speckled gecko
845
846When Guile sees the `\' argument, it replaces it with the arguments
847read from the second line of the script, producing:
848
849 /usr/local/bin/guile -e main -s ekko a speckled gecko
850
851This tells Guile to load the `ekko' script, and apply the function
852`main' to the argument list ("a" "speckled" "gecko").
853
854Here is how Guile parses the command-line arguments:
855- Each space character terminates an argument. This means that two
856 spaces in a row introduce an empty-string argument.
857- The tab character is not permitted (unless you quote it with the
858 backslash character, as described below), to avoid confusion.
859- The newline character terminates the sequence of arguments, and will
860 also terminate a final non-empty argument. (However, a newline
861 following a space will not introduce a final empty-string argument;
862 it only terminates the argument list.)
863- The backslash character is the escape character. It escapes
864 backslash, space, tab, and newline. The ANSI C escape sequences
865 like \n and \t are also supported. These produce argument
866 constituents; the two-character combination \n doesn't act like a
867 terminating newline. The escape sequence \NNN for exactly three
868 octal digits reads as the character whose ASCII code is NNN. As
869 above, characters produced this way are argument constituents.
870 Backslash followed by other characters is not allowed.
871
48d224d7
JB
872* Changes to the procedure for linking libguile with your programs
873
874** Guile now builds and installs a shared guile library, if your
875system support shared libraries. (It still builds a static library on
876all systems.) Guile automatically detects whether your system
877supports shared libraries. To prevent Guile from buildisg shared
878libraries, pass the `--disable-shared' flag to the configure script.
879
880Guile takes longer to compile when it builds shared libraries, because
881it must compile every file twice --- once to produce position-
882independent object code, and once to produce normal object code.
883
884** The libthreads library has been merged into libguile.
885
886To link a program against Guile, you now need only link against
887-lguile and -lqt; -lthreads is no longer needed. If you are using
888autoconf to generate configuration scripts for your application, the
889following lines should suffice to add the appropriate libraries to
890your link command:
891
892### Find quickthreads and libguile.
893AC_CHECK_LIB(qt, main)
894AC_CHECK_LIB(guile, scm_shell)
f3b1485f
JB
895
896* Changes to Scheme functions
897
095936d2
JB
898** Guile Scheme's special syntax for keyword objects is now optional,
899and disabled by default.
900
901The syntax variation from R4RS made it difficult to port some
902interesting packages to Guile. The routines which accepted keyword
903arguments (mostly in the module system) have been modified to also
904accept symbols whose names begin with `:'.
905
906To change the keyword syntax, you must first import the (ice-9 debug)
907module:
908 (use-modules (ice-9 debug))
909
910Then you can enable the keyword syntax as follows:
911 (read-set! keywords 'prefix)
912
913To disable keyword syntax, do this:
914 (read-set! keywords #f)
915
916** Many more primitive functions accept shared substrings as
917arguments. In the past, these functions required normal, mutable
918strings as arguments, although they never made use of this
919restriction.
920
921** The uniform array functions now operate on byte vectors. These
922functions are `array-fill!', `serial-array-copy!', `array-copy!',
923`serial-array-map', `array-map', `array-for-each', and
924`array-index-map!'.
925
926** The new functions `trace' and `untrace' implement simple debugging
927support for Scheme functions.
928
929The `trace' function accepts any number of procedures as arguments,
930and tells the Guile interpreter to display each procedure's name and
931arguments each time the procedure is invoked. When invoked with no
932arguments, `trace' returns the list of procedures currently being
933traced.
934
935The `untrace' function accepts any number of procedures as arguments,
936and tells the Guile interpreter not to trace them any more. When
937invoked with no arguments, `untrace' untraces all curretly traced
938procedures.
939
940The tracing in Guile has an advantage over most other systems: we
941don't create new procedure objects, but mark the procedure objects
942themselves. This means that anonymous and internal procedures can be
943traced.
944
945** The function `assert-repl-prompt' has been renamed to
946`set-repl-prompt!'. It takes one argument, PROMPT.
947- If PROMPT is #f, the Guile read-eval-print loop will not prompt.
948- If PROMPT is a string, we use it as a prompt.
949- If PROMPT is a procedure accepting no arguments, we call it, and
950 display the result as a prompt.
951- Otherwise, we display "> ".
952
953** The new function `eval-string' reads Scheme expressions from a
954string and evaluates them, returning the value of the last expression
955in the string. If the string contains no expressions, it returns an
956unspecified value.
957
958** The new function `thunk?' returns true iff its argument is a
959procedure of zero arguments.
960
961** `defined?' is now a builtin function, instead of syntax. This
962means that its argument should be quoted. It returns #t iff its
963argument is bound in the current module.
964
965** The new syntax `use-modules' allows you to add new modules to your
966environment without re-typing a complete `define-module' form. It
967accepts any number of module names as arguments, and imports their
968public bindings into the current module.
969
970** The new function (module-defined? NAME MODULE) returns true iff
971NAME, a symbol, is defined in MODULE, a module object.
972
973** The new function `builtin-bindings' creates and returns a hash
974table containing copies of all the root module's bindings.
975
976** The new function `builtin-weak-bindings' does the same as
977`builtin-bindings', but creates a doubly-weak hash table.
978
979** The `equal?' function now considers variable objects to be
980equivalent if they have the same name and the same value.
981
982** The new function `command-line' returns the command-line arguments
983given to Guile, as a list of strings.
984
985When using guile as a script interpreter, `command-line' returns the
986script's arguments; those processed by the interpreter (like `-s' or
987`-c') are omitted. (In other words, you get the normal, expected
988behavior.) Any application that uses scm_shell to process its
989command-line arguments gets this behavior as well.
990
991** The new function `load-user-init' looks for a file called `.guile'
992in the user's home directory, and loads it if it exists. This is
993mostly for use by the code generated by scm_compile_shell_switches,
994but we thought it might also be useful in other circumstances.
995
996** The new function `log10' returns the base-10 logarithm of its
997argument.
998
999** Changes to I/O functions
1000
1001*** The functions `read', `primitive-load', `read-and-eval!', and
1002`primitive-load-path' no longer take optional arguments controlling
1003case insensitivity and a `#' parser.
1004
1005Case sensitivity is now controlled by a read option called
1006`case-insensitive'. The user can add new `#' syntaxes with the
1007`read-hash-extend' function (see below).
1008
1009*** The new function `read-hash-extend' allows the user to change the
1010syntax of Guile Scheme in a somewhat controlled way.
1011
1012(read-hash-extend CHAR PROC)
1013 When parsing S-expressions, if we read a `#' character followed by
1014 the character CHAR, use PROC to parse an object from the stream.
1015 If PROC is #f, remove any parsing procedure registered for CHAR.
1016
1017 The reader applies PROC to two arguments: CHAR and an input port.
1018
1019*** The new functions read-delimited and read-delimited! provide a
1020general mechanism for doing delimited input on streams.
1021
1022(read-delimited DELIMS [PORT HANDLE-DELIM])
1023 Read until we encounter one of the characters in DELIMS (a string),
1024 or end-of-file. PORT is the input port to read from; it defaults to
1025 the current input port. The HANDLE-DELIM parameter determines how
1026 the terminating character is handled; it should be one of the
1027 following symbols:
1028
1029 'trim omit delimiter from result
1030 'peek leave delimiter character in input stream
1031 'concat append delimiter character to returned value
1032 'split return a pair: (RESULT . TERMINATOR)
1033
1034 HANDLE-DELIM defaults to 'peek.
1035
1036(read-delimited! DELIMS BUF [PORT HANDLE-DELIM START END])
1037 A side-effecting variant of `read-delimited'.
1038
1039 The data is written into the string BUF at the indices in the
1040 half-open interval [START, END); the default interval is the whole
1041 string: START = 0 and END = (string-length BUF). The values of
1042 START and END must specify a well-defined interval in BUF, i.e.
1043 0 <= START <= END <= (string-length BUF).
1044
1045 It returns NBYTES, the number of bytes read. If the buffer filled
1046 up without a delimiter character being found, it returns #f. If the
1047 port is at EOF when the read starts, it returns the EOF object.
1048
1049 If an integer is returned (i.e., the read is successfully terminated
1050 by reading a delimiter character), then the HANDLE-DELIM parameter
1051 determines how to handle the terminating character. It is described
1052 above, and defaults to 'peek.
1053
1054(The descriptions of these functions were borrowed from the SCSH
1055manual, by Olin Shivers and Brian Carlstrom.)
1056
1057*** The `%read-delimited!' function is the primitive used to implement
1058`read-delimited' and `read-delimited!'.
1059
1060(%read-delimited! DELIMS BUF GOBBLE? [PORT START END])
1061
1062This returns a pair of values: (TERMINATOR . NUM-READ).
1063- TERMINATOR describes why the read was terminated. If it is a
1064 character or the eof object, then that is the value that terminated
1065 the read. If it is #f, the function filled the buffer without finding
1066 a delimiting character.
1067- NUM-READ is the number of characters read into BUF.
1068
1069If the read is successfully terminated by reading a delimiter
1070character, then the gobble? parameter determines what to do with the
1071terminating character. If true, the character is removed from the
1072input stream; if false, the character is left in the input stream
1073where a subsequent read operation will retrieve it. In either case,
1074the character is also the first value returned by the procedure call.
1075
1076(The descriptions of this function was borrowed from the SCSH manual,
1077by Olin Shivers and Brian Carlstrom.)
1078
1079*** The `read-line' and `read-line!' functions have changed; they now
1080trim the terminator by default; previously they appended it to the
1081returned string. For the old behavior, use (read-line PORT 'concat).
1082
1083*** The functions `uniform-array-read!' and `uniform-array-write!' now
1084take new optional START and END arguments, specifying the region of
1085the array to read and write.
1086
f348c807
JB
1087*** The `ungetc-char-ready?' function has been removed. We feel it's
1088inappropriate for an interface to expose implementation details this
1089way.
095936d2
JB
1090
1091** Changes to the Unix library and system call interface
1092
1093*** The new fcntl function provides access to the Unix `fcntl' system
1094call.
1095
1096(fcntl PORT COMMAND VALUE)
1097 Apply COMMAND to PORT's file descriptor, with VALUE as an argument.
1098 Values for COMMAND are:
1099
1100 F_DUPFD duplicate a file descriptor
1101 F_GETFD read the descriptor's close-on-exec flag
1102 F_SETFD set the descriptor's close-on-exec flag to VALUE
1103 F_GETFL read the descriptor's flags, as set on open
1104 F_SETFL set the descriptor's flags, as set on open to VALUE
1105 F_GETOWN return the process ID of a socket's owner, for SIGIO
1106 F_SETOWN set the process that owns a socket to VALUE, for SIGIO
1107 FD_CLOEXEC not sure what this is
1108
1109For details, see the documentation for the fcntl system call.
1110
1111*** The arguments to `select' have changed, for compatibility with
1112SCSH. The TIMEOUT parameter may now be non-integral, yielding the
1113expected behavior. The MILLISECONDS parameter has been changed to
1114MICROSECONDS, to more closely resemble the underlying system call.
1115The RVEC, WVEC, and EVEC arguments can now be vectors; the type of the
1116corresponding return set will be the same.
1117
1118*** The arguments to the `mknod' system call have changed. They are
1119now:
1120
1121(mknod PATH TYPE PERMS DEV)
1122 Create a new file (`node') in the file system. PATH is the name of
1123 the file to create. TYPE is the kind of file to create; it should
1124 be 'fifo, 'block-special, or 'char-special. PERMS specifies the
1125 permission bits to give the newly created file. If TYPE is
1126 'block-special or 'char-special, DEV specifies which device the
1127 special file refers to; its interpretation depends on the kind of
1128 special file being created.
1129
1130*** The `fork' function has been renamed to `primitive-fork', to avoid
1131clashing with various SCSH forks.
1132
1133*** The `recv' and `recvfrom' functions have been renamed to `recv!'
1134and `recvfrom!'. They no longer accept a size for a second argument;
1135you must pass a string to hold the received value. They no longer
1136return the buffer. Instead, `recv' returns the length of the message
1137received, and `recvfrom' returns a pair containing the packet's length
1138and originating address.
1139
1140*** The file descriptor datatype has been removed, as have the
1141`read-fd', `write-fd', `close', `lseek', and `dup' functions.
1142We plan to replace these functions with a SCSH-compatible interface.
1143
1144*** The `create' function has been removed; it's just a special case
1145of `open'.
1146
1147*** There are new functions to break down process termination status
1148values. In the descriptions below, STATUS is a value returned by
1149`waitpid'.
1150
1151(status:exit-val STATUS)
1152 If the child process exited normally, this function returns the exit
1153 code for the child process (i.e., the value passed to exit, or
1154 returned from main). If the child process did not exit normally,
1155 this function returns #f.
1156
1157(status:stop-sig STATUS)
1158 If the child process was suspended by a signal, this function
1159 returns the signal that suspended the child. Otherwise, it returns
1160 #f.
1161
1162(status:term-sig STATUS)
1163 If the child process terminated abnormally, this function returns
1164 the signal that terminated the child. Otherwise, this function
1165 returns false.
1166
1167POSIX promises that exactly one of these functions will return true on
1168a valid STATUS value.
1169
1170These functions are compatible with SCSH.
1171
1172*** There are new accessors and setters for the broken-out time vectors
48d224d7
JB
1173returned by `localtime', `gmtime', and that ilk. They are:
1174
1175 Component Accessor Setter
1176 ========================= ============ ============
1177 seconds tm:sec set-tm:sec
1178 minutes tm:min set-tm:min
1179 hours tm:hour set-tm:hour
1180 day of the month tm:mday set-tm:mday
1181 month tm:mon set-tm:mon
1182 year tm:year set-tm:year
1183 day of the week tm:wday set-tm:wday
1184 day in the year tm:yday set-tm:yday
1185 daylight saving time tm:isdst set-tm:isdst
1186 GMT offset, seconds tm:gmtoff set-tm:gmtoff
1187 name of time zone tm:zone set-tm:zone
1188
095936d2
JB
1189*** There are new accessors for the vectors returned by `uname',
1190describing the host system:
48d224d7
JB
1191
1192 Component Accessor
1193 ============================================== ================
1194 name of the operating system implementation utsname:sysname
1195 network name of this machine utsname:nodename
1196 release level of the operating system utsname:release
1197 version level of the operating system utsname:version
1198 machine hardware platform utsname:machine
1199
095936d2
JB
1200*** There are new accessors for the vectors returned by `getpw',
1201`getpwnam', `getpwuid', and `getpwent', describing entries from the
1202system's user database:
1203
1204 Component Accessor
1205 ====================== =================
1206 user name passwd:name
1207 user password passwd:passwd
1208 user id passwd:uid
1209 group id passwd:gid
1210 real name passwd:gecos
1211 home directory passwd:dir
1212 shell program passwd:shell
1213
1214*** There are new accessors for the vectors returned by `getgr',
1215`getgrnam', `getgrgid', and `getgrent', describing entries from the
1216system's group database:
1217
1218 Component Accessor
1219 ======================= ============
1220 group name group:name
1221 group password group:passwd
1222 group id group:gid
1223 group members group:mem
1224
1225*** There are new accessors for the vectors returned by `gethost',
1226`gethostbyaddr', `gethostbyname', and `gethostent', describing
1227internet hosts:
1228
1229 Component Accessor
1230 ========================= ===============
1231 official name of host hostent:name
1232 alias list hostent:aliases
1233 host address type hostent:addrtype
1234 length of address hostent:length
1235 list of addresses hostent:addr-list
1236
1237*** There are new accessors for the vectors returned by `getnet',
1238`getnetbyaddr', `getnetbyname', and `getnetent', describing internet
1239networks:
1240
1241 Component Accessor
1242 ========================= ===============
1243 official name of net netent:name
1244 alias list netent:aliases
1245 net number type netent:addrtype
1246 net number netent:net
1247
1248*** There are new accessors for the vectors returned by `getproto',
1249`getprotobyname', `getprotobynumber', and `getprotoent', describing
1250internet protocols:
1251
1252 Component Accessor
1253 ========================= ===============
1254 official protocol name protoent:name
1255 alias list protoent:aliases
1256 protocol number protoent:proto
1257
1258*** There are new accessors for the vectors returned by `getserv',
1259`getservbyname', `getservbyport', and `getservent', describing
1260internet protocols:
1261
1262 Component Accessor
1263 ========================= ===============
1264 official service name servent:name
1265 alias list servent:aliases
1266 port number servent:port
1267 protocol to use servent:proto
1268
1269*** There are new accessors for the sockaddr structures returned by
1270`accept', `getsockname', `getpeername', `recvfrom!':
1271
1272 Component Accessor
1273 ======================================== ===============
1274 address format (`family') sockaddr:fam
1275 path, for file domain addresses sockaddr:path
1276 address, for internet domain addresses sockaddr:addr
1277 TCP or UDP port, for internet sockaddr:port
1278
1279*** The `getpwent', `getgrent', `gethostent', `getnetent',
1280`getprotoent', and `getservent' functions now return #f at the end of
1281the user database. (They used to throw an exception.)
1282
1283Note that calling MUMBLEent function is equivalent to calling the
1284corresponding MUMBLE function with no arguments.
1285
1286*** The `setpwent', `setgrent', `sethostent', `setnetent',
1287`setprotoent', and `setservent' routines now take no arguments.
1288
1289*** The `gethost', `getproto', `getnet', and `getserv' functions now
1290provide more useful information when they throw an exception.
1291
1292*** The `lnaof' function has been renamed to `inet-lnaof'.
1293
1294*** Guile now claims to have the `current-time' feature.
1295
1296*** The `mktime' function now takes an optional second argument ZONE,
1297giving the time zone to use for the conversion. ZONE should be a
1298string, in the same format as expected for the "TZ" environment variable.
1299
1300*** The `strptime' function now returns a pair (TIME . COUNT), where
1301TIME is the parsed time as a vector, and COUNT is the number of
1302characters from the string left unparsed. This function used to
1303return the remaining characters as a string.
1304
1305*** The `gettimeofday' function has replaced the old `time+ticks' function.
1306The return value is now (SECONDS . MICROSECONDS); the fractional
1307component is no longer expressed in "ticks".
1308
1309*** The `ticks/sec' constant has been removed, in light of the above change.
6685dc83 1310
ea00ecba
MG
1311* Changes to the gh_ interface
1312
1313** gh_eval_str() now returns an SCM object which is the result of the
1314evaluation
1315
aaef0d2a
MG
1316** gh_scm2str() now copies the Scheme data to a caller-provided C
1317array
1318
1319** gh_scm2newstr() now makes a C array, copies the Scheme data to it,
1320and returns the array
1321
1322** gh_scm2str0() is gone: there is no need to distinguish
1323null-terminated from non-null-terminated, since gh_scm2newstr() allows
1324the user to interpret the data both ways.
1325
f3b1485f
JB
1326* Changes to the scm_ interface
1327
095936d2
JB
1328** The new function scm_symbol_value0 provides an easy way to get a
1329symbol's value from C code:
1330
1331SCM scm_symbol_value0 (char *NAME)
1332 Return the value of the symbol named by the null-terminated string
1333 NAME in the current module. If the symbol named NAME is unbound in
1334 the current module, return SCM_UNDEFINED.
1335
1336** The new function scm_sysintern0 creates new top-level variables,
1337without assigning them a value.
1338
1339SCM scm_sysintern0 (char *NAME)
1340 Create a new Scheme top-level variable named NAME. NAME is a
1341 null-terminated string. Return the variable's value cell.
1342
1343** The function scm_internal_catch is the guts of catch. It handles
1344all the mechanics of setting up a catch target, invoking the catch
1345body, and perhaps invoking the handler if the body does a throw.
1346
1347The function is designed to be usable from C code, but is general
1348enough to implement all the semantics Guile Scheme expects from throw.
1349
1350TAG is the catch tag. Typically, this is a symbol, but this function
1351doesn't actually care about that.
1352
1353BODY is a pointer to a C function which runs the body of the catch;
1354this is the code you can throw from. We call it like this:
1355 BODY (BODY_DATA, JMPBUF)
1356where:
1357 BODY_DATA is just the BODY_DATA argument we received; we pass it
1358 through to BODY as its first argument. The caller can make
1359 BODY_DATA point to anything useful that BODY might need.
1360 JMPBUF is the Scheme jmpbuf object corresponding to this catch,
1361 which we have just created and initialized.
1362
1363HANDLER is a pointer to a C function to deal with a throw to TAG,
1364should one occur. We call it like this:
1365 HANDLER (HANDLER_DATA, THROWN_TAG, THROW_ARGS)
1366where
1367 HANDLER_DATA is the HANDLER_DATA argument we recevied; it's the
1368 same idea as BODY_DATA above.
1369 THROWN_TAG is the tag that the user threw to; usually this is
1370 TAG, but it could be something else if TAG was #t (i.e., a
1371 catch-all), or the user threw to a jmpbuf.
1372 THROW_ARGS is the list of arguments the user passed to the THROW
1373 function.
1374
1375BODY_DATA is just a pointer we pass through to BODY. HANDLER_DATA
1376is just a pointer we pass through to HANDLER. We don't actually
1377use either of those pointers otherwise ourselves. The idea is
1378that, if our caller wants to communicate something to BODY or
1379HANDLER, it can pass a pointer to it as MUMBLE_DATA, which BODY and
1380HANDLER can then use. Think of it as a way to make BODY and
1381HANDLER closures, not just functions; MUMBLE_DATA points to the
1382enclosed variables.
1383
1384Of course, it's up to the caller to make sure that any data a
1385MUMBLE_DATA needs is protected from GC. A common way to do this is
1386to make MUMBLE_DATA a pointer to data stored in an automatic
1387structure variable; since the collector must scan the stack for
1388references anyway, this assures that any references in MUMBLE_DATA
1389will be found.
1390
1391** The new function scm_internal_lazy_catch is exactly like
1392scm_internal_catch, except:
1393
1394- It does not unwind the stack (this is the major difference).
1395- If handler returns, its value is returned from the throw.
1396- BODY always receives #f as its JMPBUF argument (since there's no
1397 jmpbuf associated with a lazy catch, because we don't unwind the
1398 stack.)
1399
1400** scm_body_thunk is a new body function you can pass to
1401scm_internal_catch if you want the body to be like Scheme's `catch'
1402--- a thunk, or a function of one argument if the tag is #f.
1403
1404BODY_DATA is a pointer to a scm_body_thunk_data structure, which
1405contains the Scheme procedure to invoke as the body, and the tag
1406we're catching. If the tag is #f, then we pass JMPBUF (created by
1407scm_internal_catch) to the body procedure; otherwise, the body gets
1408no arguments.
1409
1410** scm_handle_by_proc is a new handler function you can pass to
1411scm_internal_catch if you want the handler to act like Scheme's catch
1412--- call a procedure with the tag and the throw arguments.
1413
1414If the user does a throw to this catch, this function runs a handler
1415procedure written in Scheme. HANDLER_DATA is a pointer to an SCM
1416variable holding the Scheme procedure object to invoke. It ought to
1417be a pointer to an automatic variable (i.e., one living on the stack),
1418or the procedure object should be otherwise protected from GC.
1419
1420** scm_handle_by_message is a new handler function to use with
1421`scm_internal_catch' if you want Guile to print a message and die.
1422It's useful for dealing with throws to uncaught keys at the top level.
1423
1424HANDLER_DATA, if non-zero, is assumed to be a char * pointing to a
1425message header to print; if zero, we use "guile" instead. That
1426text is followed by a colon, then the message described by ARGS.
1427
1428** The return type of scm_boot_guile is now void; the function does
1429not return a value, and indeed, never returns at all.
1430
f3b1485f
JB
1431** The new function scm_shell makes it easy for user applications to
1432process command-line arguments in a way that is compatible with the
1433stand-alone guile interpreter (which is in turn compatible with SCSH,
1434the Scheme shell).
1435
1436To use the scm_shell function, first initialize any guile modules
1437linked into your application, and then call scm_shell with the values
1438of ARGC and ARGV your `main' function received. scm_shell will adding
1439any SCSH-style meta-arguments from the top of the script file to the
1440argument vector, and then process the command-line arguments. This
1441generally means loading a script file or starting up an interactive
1442command interpreter. For details, see "Changes to the stand-alone
1443interpreter" above.
1444
095936d2
JB
1445** The new functions scm_get_meta_args and scm_count_argv help you
1446implement the SCSH-style meta-argument, `\'.
1447
1448char **scm_get_meta_args (int ARGC, char **ARGV)
1449 If the second element of ARGV is a string consisting of a single
1450 backslash character (i.e. "\\" in Scheme notation), open the file
1451 named by the following argument, parse arguments from it, and return
1452 the spliced command line. The returned array is terminated by a
1453 null pointer.
1454
1455 For details of argument parsing, see above, under "guile now accepts
1456 command-line arguments compatible with SCSH..."
1457
1458int scm_count_argv (char **ARGV)
1459 Count the arguments in ARGV, assuming it is terminated by a null
1460 pointer.
1461
1462For an example of how these functions might be used, see the source
1463code for the function scm_shell in libguile/script.c.
1464
1465You will usually want to use scm_shell instead of calling this
1466function yourself.
1467
1468** The new function scm_compile_shell_switches turns an array of
1469command-line arguments into Scheme code to carry out the actions they
1470describe. Given ARGC and ARGV, it returns a Scheme expression to
1471evaluate, and calls scm_set_program_arguments to make any remaining
1472command-line arguments available to the Scheme code. For example,
1473given the following arguments:
1474
1475 -e main -s ekko a speckled gecko
1476
1477scm_set_program_arguments will return the following expression:
1478
1479 (begin (load "ekko") (main (command-line)) (quit))
1480
1481You will usually want to use scm_shell instead of calling this
1482function yourself.
1483
1484** The function scm_shell_usage prints a usage message appropriate for
1485an interpreter that uses scm_compile_shell_switches to handle its
1486command-line arguments.
1487
1488void scm_shell_usage (int FATAL, char *MESSAGE)
1489 Print a usage message to the standard error output. If MESSAGE is
1490 non-zero, write it before the usage message, followed by a newline.
1491 If FATAL is non-zero, exit the process, using FATAL as the
1492 termination status. (If you want to be compatible with Guile,
1493 always use 1 as the exit status when terminating due to command-line
1494 usage problems.)
1495
1496You will usually want to use scm_shell instead of calling this
1497function yourself.
48d224d7
JB
1498
1499** scm_eval_0str now returns SCM_UNSPECIFIED if the string contains no
095936d2
JB
1500expressions. It used to return SCM_EOL. Earth-shattering.
1501
1502** The macros for declaring scheme objects in C code have been
1503rearranged slightly. They are now:
1504
1505SCM_SYMBOL (C_NAME, SCHEME_NAME)
1506 Declare a static SCM variable named C_NAME, and initialize it to
1507 point to the Scheme symbol whose name is SCHEME_NAME. C_NAME should
1508 be a C identifier, and SCHEME_NAME should be a C string.
1509
1510SCM_GLOBAL_SYMBOL (C_NAME, SCHEME_NAME)
1511 Just like SCM_SYMBOL, but make C_NAME globally visible.
1512
1513SCM_VCELL (C_NAME, SCHEME_NAME)
1514 Create a global variable at the Scheme level named SCHEME_NAME.
1515 Declare a static SCM variable named C_NAME, and initialize it to
1516 point to the Scheme variable's value cell.
1517
1518SCM_GLOBAL_VCELL (C_NAME, SCHEME_NAME)
1519 Just like SCM_VCELL, but make C_NAME globally visible.
1520
1521The `guile-snarf' script writes initialization code for these macros
1522to its standard output, given C source code as input.
1523
1524The SCM_GLOBAL macro is gone.
1525
1526** The scm_read_line and scm_read_line_x functions have been replaced
1527by Scheme code based on the %read-delimited! procedure (known to C
1528code as scm_read_delimited_x). See its description above for more
1529information.
48d224d7 1530
095936d2
JB
1531** The function scm_sys_open has been renamed to scm_open. It now
1532returns a port instead of an FD object.
ea00ecba 1533
095936d2
JB
1534* The dynamic linking support has changed. For more information, see
1535libguile/DYNAMIC-LINKING.
ea00ecba 1536
f7b47737
JB
1537\f
1538Guile 1.0b3
3065a62a 1539
f3b1485f
JB
1540User-visible changes from Thursday, September 5, 1996 until Guile 1.0
1541(Sun 5 Jan 1997):
3065a62a 1542
4b521edb 1543* Changes to the 'guile' program:
3065a62a 1544
4b521edb
JB
1545** Guile now loads some new files when it starts up. Guile first
1546searches the load path for init.scm, and loads it if found. Then, if
1547Guile is not being used to execute a script, and the user's home
1548directory contains a file named `.guile', Guile loads that.
c6486f8a 1549
4b521edb 1550** You can now use Guile as a shell script interpreter.
3065a62a
JB
1551
1552To paraphrase the SCSH manual:
1553
1554 When Unix tries to execute an executable file whose first two
1555 characters are the `#!', it treats the file not as machine code to
1556 be directly executed by the native processor, but as source code
1557 to be executed by some interpreter. The interpreter to use is
1558 specified immediately after the #! sequence on the first line of
1559 the source file. The kernel reads in the name of the interpreter,
1560 and executes that instead. It passes the interpreter the source
1561 filename as its first argument, with the original arguments
1562 following. Consult the Unix man page for the `exec' system call
1563 for more information.
1564
1a1945be
JB
1565Now you can use Guile as an interpreter, using a mechanism which is a
1566compatible subset of that provided by SCSH.
1567
3065a62a
JB
1568Guile now recognizes a '-s' command line switch, whose argument is the
1569name of a file of Scheme code to load. It also treats the two
1570characters `#!' as the start of a comment, terminated by `!#'. Thus,
1571to make a file of Scheme code directly executable by Unix, insert the
1572following two lines at the top of the file:
1573
1574#!/usr/local/bin/guile -s
1575!#
1576
1577Guile treats the argument of the `-s' command-line switch as the name
1578of a file of Scheme code to load, and treats the sequence `#!' as the
1579start of a block comment, terminated by `!#'.
1580
1581For example, here's a version of 'echo' written in Scheme:
1582
1583#!/usr/local/bin/guile -s
1584!#
1585(let loop ((args (cdr (program-arguments))))
1586 (if (pair? args)
1587 (begin
1588 (display (car args))
1589 (if (pair? (cdr args))
1590 (display " "))
1591 (loop (cdr args)))))
1592(newline)
1593
1594Why does `#!' start a block comment terminated by `!#', instead of the
1595end of the line? That is the notation SCSH uses, and although we
1596don't yet support the other SCSH features that motivate that choice,
1597we would like to be backward-compatible with any existing Guile
3763761c
JB
1598scripts once we do. Furthermore, if the path to Guile on your system
1599is too long for your kernel, you can start the script with this
1600horrible hack:
1601
1602#!/bin/sh
1603exec /really/long/path/to/guile -s "$0" ${1+"$@"}
1604!#
3065a62a
JB
1605
1606Note that some very old Unix systems don't support the `#!' syntax.
1607
c6486f8a 1608
4b521edb 1609** You can now run Guile without installing it.
6685dc83
JB
1610
1611Previous versions of the interactive Guile interpreter (`guile')
1612couldn't start up unless Guile's Scheme library had been installed;
1613they used the value of the environment variable `SCHEME_LOAD_PATH'
1614later on in the startup process, but not to find the startup code
1615itself. Now Guile uses `SCHEME_LOAD_PATH' in all searches for Scheme
1616code.
1617
1618To run Guile without installing it, build it in the normal way, and
1619then set the environment variable `SCHEME_LOAD_PATH' to a
1620colon-separated list of directories, including the top-level directory
1621of the Guile sources. For example, if you unpacked Guile so that the
1622full filename of this NEWS file is /home/jimb/guile-1.0b3/NEWS, then
1623you might say
1624
1625 export SCHEME_LOAD_PATH=/home/jimb/my-scheme:/home/jimb/guile-1.0b3
1626
c6486f8a 1627
4b521edb
JB
1628** Guile's read-eval-print loop no longer prints #<unspecified>
1629results. If the user wants to see this, she can evaluate the
1630expression (assert-repl-print-unspecified #t), perhaps in her startup
48d224d7 1631file.
6685dc83 1632
4b521edb
JB
1633** Guile no longer shows backtraces by default when an error occurs;
1634however, it does display a message saying how to get one, and how to
1635request that they be displayed by default. After an error, evaluate
1636 (backtrace)
1637to see a backtrace, and
1638 (debug-enable 'backtrace)
1639to see them by default.
6685dc83 1640
6685dc83 1641
d9fb83d9 1642
4b521edb
JB
1643* Changes to Guile Scheme:
1644
1645** Guile now distinguishes between #f and the empty list.
1646
1647This is for compatibility with the IEEE standard, the (possibly)
1648upcoming Revised^5 Report on Scheme, and many extant Scheme
1649implementations.
1650
1651Guile used to have #f and '() denote the same object, to make Scheme's
1652type system more compatible with Emacs Lisp's. However, the change
1653caused too much trouble for Scheme programmers, and we found another
1654way to reconcile Emacs Lisp with Scheme that didn't require this.
1655
1656
1657** Guile's delq, delv, delete functions, and their destructive
c6486f8a
JB
1658counterparts, delq!, delv!, and delete!, now remove all matching
1659elements from the list, not just the first. This matches the behavior
1660of the corresponding Emacs Lisp functions, and (I believe) the Maclisp
1661functions which inspired them.
1662
1663I recognize that this change may break code in subtle ways, but it
1664seems best to make the change before the FSF's first Guile release,
1665rather than after.
1666
1667
4b521edb 1668** The compiled-library-path function has been deleted from libguile.
6685dc83 1669
4b521edb 1670** The facilities for loading Scheme source files have changed.
c6486f8a 1671
4b521edb 1672*** The variable %load-path now tells Guile which directories to search
6685dc83
JB
1673for Scheme code. Its value is a list of strings, each of which names
1674a directory.
1675
4b521edb
JB
1676*** The variable %load-extensions now tells Guile which extensions to
1677try appending to a filename when searching the load path. Its value
1678is a list of strings. Its default value is ("" ".scm").
1679
1680*** (%search-load-path FILENAME) searches the directories listed in the
1681value of the %load-path variable for a Scheme file named FILENAME,
1682with all the extensions listed in %load-extensions. If it finds a
1683match, then it returns its full filename. If FILENAME is absolute, it
1684returns it unchanged. Otherwise, it returns #f.
6685dc83 1685
4b521edb
JB
1686%search-load-path will not return matches that refer to directories.
1687
1688*** (primitive-load FILENAME :optional CASE-INSENSITIVE-P SHARP)
1689uses %seach-load-path to find a file named FILENAME, and loads it if
1690it finds it. If it can't read FILENAME for any reason, it throws an
1691error.
6685dc83
JB
1692
1693The arguments CASE-INSENSITIVE-P and SHARP are interpreted as by the
4b521edb
JB
1694`read' function.
1695
1696*** load uses the same searching semantics as primitive-load.
1697
1698*** The functions %try-load, try-load-with-path, %load, load-with-path,
1699basic-try-load-with-path, basic-load-with-path, try-load-module-with-
1700path, and load-module-with-path have been deleted. The functions
1701above should serve their purposes.
1702
1703*** If the value of the variable %load-hook is a procedure,
1704`primitive-load' applies its value to the name of the file being
1705loaded (without the load path directory name prepended). If its value
1706is #f, it is ignored. Otherwise, an error occurs.
1707
1708This is mostly useful for printing load notification messages.
1709
1710
1711** The function `eval!' is no longer accessible from the scheme level.
1712We can't allow operations which introduce glocs into the scheme level,
1713because Guile's type system can't handle these as data. Use `eval' or
1714`read-and-eval!' (see below) as replacement.
1715
1716** The new function read-and-eval! reads an expression from PORT,
1717evaluates it, and returns the result. This is more efficient than
1718simply calling `read' and `eval', since it is not necessary to make a
1719copy of the expression for the evaluator to munge.
1720
1721Its optional arguments CASE_INSENSITIVE_P and SHARP are interpreted as
1722for the `read' function.
1723
1724
1725** The function `int?' has been removed; its definition was identical
1726to that of `integer?'.
1727
1728** The functions `<?', `<?', `<=?', `=?', `>?', and `>=?'. Code should
1729use the R4RS names for these functions.
1730
1731** The function object-properties no longer returns the hash handle;
1732it simply returns the object's property list.
1733
1734** Many functions have been changed to throw errors, instead of
1735returning #f on failure. The point of providing exception handling in
1736the language is to simplify the logic of user code, but this is less
1737useful if Guile's primitives don't throw exceptions.
1738
1739** The function `fileno' has been renamed from `%fileno'.
1740
1741** The function primitive-mode->fdes returns #t or #f now, not 1 or 0.
1742
1743
1744* Changes to Guile's C interface:
1745
1746** The library's initialization procedure has been simplified.
1747scm_boot_guile now has the prototype:
1748
1749void scm_boot_guile (int ARGC,
1750 char **ARGV,
1751 void (*main_func) (),
1752 void *closure);
1753
1754scm_boot_guile calls MAIN_FUNC, passing it CLOSURE, ARGC, and ARGV.
1755MAIN_FUNC should do all the work of the program (initializing other
1756packages, reading user input, etc.) before returning. When MAIN_FUNC
1757returns, call exit (0); this function never returns. If you want some
1758other exit value, MAIN_FUNC may call exit itself.
1759
1760scm_boot_guile arranges for program-arguments to return the strings
1761given by ARGC and ARGV. If MAIN_FUNC modifies ARGC/ARGV, should call
1762scm_set_program_arguments with the final list, so Scheme code will
1763know which arguments have been processed.
1764
1765scm_boot_guile establishes a catch-all catch handler which prints an
1766error message and exits the process. This means that Guile exits in a
1767coherent way when system errors occur and the user isn't prepared to
1768handle it. If the user doesn't like this behavior, they can establish
1769their own universal catcher in MAIN_FUNC to shadow this one.
1770
1771Why must the caller do all the real work from MAIN_FUNC? The garbage
1772collector assumes that all local variables of type SCM will be above
1773scm_boot_guile's stack frame on the stack. If you try to manipulate
1774SCM values after this function returns, it's the luck of the draw
1775whether the GC will be able to find the objects you allocate. So,
1776scm_boot_guile function exits, rather than returning, to discourage
1777people from making that mistake.
1778
1779The IN, OUT, and ERR arguments were removed; there are other
1780convenient ways to override these when desired.
1781
1782The RESULT argument was deleted; this function should never return.
1783
1784The BOOT_CMD argument was deleted; the MAIN_FUNC argument is more
1785general.
1786
1787
1788** Guile's header files should no longer conflict with your system's
1789header files.
1790
1791In order to compile code which #included <libguile.h>, previous
1792versions of Guile required you to add a directory containing all the
1793Guile header files to your #include path. This was a problem, since
1794Guile's header files have names which conflict with many systems'
1795header files.
1796
1797Now only <libguile.h> need appear in your #include path; you must
1798refer to all Guile's other header files as <libguile/mumble.h>.
1799Guile's installation procedure puts libguile.h in $(includedir), and
1800the rest in $(includedir)/libguile.
1801
1802
1803** Two new C functions, scm_protect_object and scm_unprotect_object,
1804have been added to the Guile library.
1805
1806scm_protect_object (OBJ) protects OBJ from the garbage collector.
1807OBJ will not be freed, even if all other references are dropped,
1808until someone does scm_unprotect_object (OBJ). Both functions
1809return OBJ.
1810
1811Note that calls to scm_protect_object do not nest. You can call
1812scm_protect_object any number of times on a given object, and the
1813next call to scm_unprotect_object will unprotect it completely.
1814
1815Basically, scm_protect_object and scm_unprotect_object just
1816maintain a list of references to things. Since the GC knows about
1817this list, all objects it mentions stay alive. scm_protect_object
1818adds its argument to the list; scm_unprotect_object remove its
1819argument from the list.
1820
1821
1822** scm_eval_0str now returns the value of the last expression
1823evaluated.
1824
1825** The new function scm_read_0str reads an s-expression from a
1826null-terminated string, and returns it.
1827
1828** The new function `scm_stdio_to_port' converts a STDIO file pointer
1829to a Scheme port object.
1830
1831** The new function `scm_set_program_arguments' allows C code to set
1832the value teruturned by the Scheme `program-arguments' function.
6685dc83 1833
6685dc83 1834\f
1a1945be
JB
1835Older changes:
1836
1837* Guile no longer includes sophisticated Tcl/Tk support.
1838
1839The old Tcl/Tk support was unsatisfying to us, because it required the
1840user to link against the Tcl library, as well as Tk and Guile. The
1841interface was also un-lispy, in that it preserved Tcl/Tk's practice of
1842referring to widgets by names, rather than exporting widgets to Scheme
1843code as a special datatype.
1844
1845In the Usenix Tk Developer's Workshop held in July 1996, the Tcl/Tk
1846maintainers described some very interesting changes in progress to the
1847Tcl/Tk internals, which would facilitate clean interfaces between lone
1848Tk and other interpreters --- even for garbage-collected languages
1849like Scheme. They expected the new Tk to be publicly available in the
1850fall of 1996.
1851
1852Since it seems that Guile might soon have a new, cleaner interface to
1853lone Tk, and that the old Guile/Tk glue code would probably need to be
1854completely rewritten, we (Jim Blandy and Richard Stallman) have
1855decided not to support the old code. We'll spend the time instead on
1856a good interface to the newer Tk, as soon as it is available.
5c54da76 1857
8512dea6 1858Until then, gtcltk-lib provides trivial, low-maintenance functionality.
deb95d71 1859
5c54da76
JB
1860\f
1861Copyright information:
1862
ea00ecba 1863Copyright (C) 1996,1997 Free Software Foundation, Inc.
5c54da76
JB
1864
1865 Permission is granted to anyone to make or distribute verbatim copies
1866 of this document as received, in any medium, provided that the
1867 copyright notice and this permission notice are preserved,
1868 thus giving the recipient permission to redistribute in turn.
1869
1870 Permission is granted to distribute modified versions
1871 of this document, or of portions of it,
1872 under the above conditions, provided also that they
1873 carry prominent notices stating who last changed them.
1874
48d224d7
JB
1875\f
1876Local variables:
1877mode: outline
1878paragraph-separate: "[ \f]*$"
1879end:
1880