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