From 139c38d9204dd07f6b235f83bae644faedbc63fd Mon Sep 17 00:00:00 2001 From: Anthony Fok Date: Sun, 22 Jan 2017 08:55:46 -0700 Subject: [PATCH] Import guile-1.8 as multiple upstream tarball component Originally guile-1.8_1.8.8+1.orig.tar.bz2, recompressed with gzip as lilypond_2.18.2.orig-guile18.tar.gz (to work around current gbp limitation), to allow for LilyPond to be linked with libguile-1.8 statically after guile-1.8's removal from Debian "stretch". --- guile18/.gitignore | 77 + guile18/ABOUT-NLS | 1101 ++ guile18/ANNOUNCE | 60 + guile18/AUTHORS | 345 + guile18/COPYING.LESSER | 504 + guile18/ChangeLog | 17 + guile18/ChangeLog-2008 | 3315 ++++ guile18/GUILE-VERSION | 56 + guile18/HACKING | 339 + guile18/LICENSE | 2 + guile18/Makefile.am | 46 + guile18/NEWS | 7432 ++++++++ guile18/README | 382 + guile18/THANKS | 121 + guile18/acinclude.m4 | 310 + guile18/am/ChangeLog-2008 | 18 + guile18/am/Makefile.am | 28 + guile18/am/README | 3 + guile18/am/maintainer-dirs | 34 + guile18/am/pre-inst-guile | 34 + guile18/autogen.sh | 16 + guile18/benchmark-guile.in | 48 + guile18/benchmark-suite/ChangeLog-2008 | 85 + guile18/benchmark-suite/Makefile.am | 10 + guile18/benchmark-suite/README | 18 + .../benchmark-suite/benchmarks/0-reference.bm | 2 + .../benchmarks/continuations.bm | 5 + guile18/benchmark-suite/benchmarks/if.bm | 51 + guile18/benchmark-suite/benchmarks/logand.bm | 6 + guile18/benchmark-suite/benchmarks/read.bm | 62 + guile18/benchmark-suite/benchmarks/subr.bm | 66 + .../benchmarks/uniform-vector-read.bm | 53 + guile18/benchmark-suite/guile-benchmark | 220 + guile18/benchmark-suite/lib.scm | 530 + guile18/build-aux/config.rpath | 666 + guile18/check-guile.in | 49 + guile18/config.rpath | 666 + guile18/configure.in | 1605 ++ guile18/doc/.gitignore | 1 + guile18/doc/ChangeLog-2008 | 996 ++ guile18/doc/ChangeLog-guile-doc | 48 + guile18/doc/Makefile.am | 46 + guile18/doc/NEWS | 44 + guile18/doc/README | 33 + guile18/doc/THANKS | 19 + guile18/doc/example-smob/ChangeLog-2008 | 56 + guile18/doc/example-smob/README | 6 + guile18/doc/example-smob/image-type.c | 137 + guile18/doc/example-smob/image-type.h | 3 + guile18/doc/example-smob/myguile.c | 37 + guile18/doc/goops/ChangeLog-2008 | 76 + guile18/doc/goops/Makefile.am | 29 + guile18/doc/goops/goops-tutorial.texi | 837 + guile18/doc/goops/goops.texi | 2905 ++++ guile18/doc/goops/hierarchy.eps | 127 + guile18/doc/goops/hierarchy.pdf | 74 + guile18/doc/goops/hierarchy.png | Bin 0 -> 6251 bytes guile18/doc/goops/hierarchy.txt | 14 + guile18/doc/goops/mop.text | 66 + guile18/doc/groupings.alist | 176 + guile18/doc/guile-api.alist | 3219 ++++ guile18/doc/guile.1 | 99 + guile18/doc/hacks.el | 16 + guile18/doc/maint/ChangeLog-2008 | 75 + guile18/doc/maint/README | 35 + guile18/doc/maint/docstring.el | 622 + guile18/doc/mbapi.texi | 987 ++ guile18/doc/mltext.texi | 146 + guile18/doc/oldfmt.c | 193 + guile18/doc/r5rs/ChangeLog-2008 | 17 + guile18/doc/r5rs/Makefile.am | 26 + guile18/doc/r5rs/r5rs.texi | 8537 ++++++++++ guile18/doc/recipe-guidelines.txt | 80 + guile18/doc/ref/.gitignore | 1 + guile18/doc/ref/ChangeLog-2008 | 2627 +++ guile18/doc/ref/ChangeLog-guile-doc-ref | 890 + guile18/doc/ref/Makefile.am | 92 + guile18/doc/ref/api-binding.texi | 283 + guile18/doc/ref/api-compound.texi | 3889 +++++ guile18/doc/ref/api-control.texi | 1506 ++ guile18/doc/ref/api-data.texi | 5142 ++++++ guile18/doc/ref/api-debug.texi | 1905 +++ guile18/doc/ref/api-evaluation.texi | 645 + guile18/doc/ref/api-i18n.texi | 158 + guile18/doc/ref/api-init.texi | 110 + guile18/doc/ref/api-io.texi | 1286 ++ guile18/doc/ref/api-memory.texi | 483 + guile18/doc/ref/api-options.texi | 757 + guile18/doc/ref/api-overview.texi | 112 + guile18/doc/ref/api-procedures.texi | 877 + guile18/doc/ref/api-scheduling.texi | 820 + guile18/doc/ref/api-scm.texi | 45 + guile18/doc/ref/api-smobs.texi | 198 + guile18/doc/ref/api-snarf.texi | 143 + guile18/doc/ref/api-translation.texi | 54 + guile18/doc/ref/api-undocumented.texi | 994 ++ guile18/doc/ref/api-utility.texi | 841 + guile18/doc/ref/api.txt | 185 + guile18/doc/ref/autoconf.texi | 271 + guile18/doc/ref/data-rep.texi | 1347 ++ guile18/doc/ref/expect.texi | 148 + guile18/doc/ref/extend.texi | 50 + guile18/doc/ref/fdl.texi | 452 + guile18/doc/ref/gh.texi | 1201 ++ guile18/doc/ref/indices.texi | 58 + guile18/doc/ref/libguile-concepts.texi | 618 + guile18/doc/ref/libguile-extensions.texi | 115 + guile18/doc/ref/libguile-linking.texi | 190 + guile18/doc/ref/libguile-program.texi | 788 + guile18/doc/ref/libguile-smobs.texi | 699 + guile18/doc/ref/libguile-snarf.texi | 131 + guile18/doc/ref/misc-modules.texi | 1532 ++ guile18/doc/ref/mod-getopt-long.texi | 341 + guile18/doc/ref/new-docstrings.texi | 3 + guile18/doc/ref/preface.texi | 191 + guile18/doc/ref/repl-modules.texi | 293 + guile18/doc/ref/scheme-debugging.texi | 124 + guile18/doc/ref/scheme-ideas.texi | 1582 ++ guile18/doc/ref/scheme-indices.texi | 16 + guile18/doc/ref/scheme-intro.texi | 41 + guile18/doc/ref/scheme-reading.texi | 35 + guile18/doc/ref/scheme-scripts.texi | 529 + guile18/doc/ref/script-getopt.texi | 94 + guile18/doc/ref/scsh.texi | 26 + guile18/doc/ref/slib.texi | 122 + guile18/doc/ref/srfi-modules.texi | 3274 ++++ guile18/doc/ref/tcltk.texi | 9 + guile18/doc/ref/tools.texi | 397 + guile18/doc/sources/ChangeLog-2008 | 5 + guile18/doc/sources/Makefile.am | 7 + guile18/doc/sources/contributors.texi | 80 + guile18/doc/sources/debug-c.texi | 2 + guile18/doc/sources/debug-scheme.texi | 2 + guile18/doc/sources/env.texi | 1165 ++ guile18/doc/sources/format.texi | 434 + guile18/doc/sources/guile-slib.texi | 2 + guile18/doc/sources/jimb-org.texi | 131 + guile18/doc/sources/libguile-overview.texi | 30 + guile18/doc/sources/libguile-tools.texi | 191 + guile18/doc/sources/new-types.texi | 2 + guile18/doc/sources/old-intro.texi | 290 + guile18/doc/sources/sample-APIs.texi | 6 + guile18/doc/sources/scheme-concepts.texi | 249 + guile18/doc/sources/scm-ref.texi | 4 + guile18/doc/sources/strings.texi | 45 + guile18/doc/sources/tk.texi | 5 + guile18/doc/sources/unix-other.texi | 132 + guile18/doc/sources/unix.texi | 622 + guile18/doc/tutorial/ChangeLog-2008 | 54 + .../doc/tutorial/ChangeLog-guile-doc-tutorial | 16 + guile18/doc/tutorial/Makefile.am | 26 + guile18/doc/tutorial/guile-tut.texi | 1373 ++ guile18/doc/use-cases.fig | 199 + guile18/doc/use-cases.txt | 22 + guile18/emacs/ChangeLog-2008 | 321 + guile18/emacs/Makefile.am | 27 + guile18/emacs/README | 12 + guile18/emacs/gds-scheme.el | 534 + guile18/emacs/gds-server.el | 111 + guile18/emacs/gds.el | 629 + guile18/emacs/gud-guile.el | 81 + guile18/emacs/guile-c.el | 178 + guile18/emacs/guile-emacs.scm | 154 + guile18/emacs/guile-scheme.el | 346 + guile18/emacs/guile.el | 215 + guile18/emacs/multistring.el | 222 + guile18/emacs/patch.el | 106 + guile18/emacs/ppexpand.el | 94 + guile18/emacs/update-changelog.el | 145 + guile18/examples/ChangeLog-2008 | 155 + guile18/examples/Makefile.am | 94 + guile18/examples/README | 40 + guile18/examples/box-dynamic-module/README | 77 + .../examples/box-dynamic-module/box-mixed.scm | 44 + .../box-dynamic-module/box-module.scm | 25 + guile18/examples/box-dynamic-module/box.c | 127 + guile18/examples/box-dynamic/README | 58 + guile18/examples/box-dynamic/box.c | 128 + guile18/examples/box-module/README | 56 + guile18/examples/box-module/box.c | 160 + guile18/examples/box/README | 48 + guile18/examples/box/box.c | 148 + guile18/examples/check.test | 238 + guile18/examples/compat/acconfig.h | 1 + guile18/examples/compat/acinclude.m4 | 18 + guile18/examples/compat/compat.h | 161 + guile18/examples/compat/configure.in | 15 + guile18/examples/modules/README | 32 + guile18/examples/modules/main | 52 + guile18/examples/modules/module-0.scm | 24 + guile18/examples/modules/module-1.scm | 24 + guile18/examples/modules/module-2.scm | 28 + guile18/examples/safe/README | 41 + guile18/examples/safe/evil.scm | 27 + guile18/examples/safe/safe | 85 + guile18/examples/safe/untrusted.scm | 33 + guile18/examples/scripts/README | 38 + guile18/examples/scripts/fact | 69 + guile18/examples/scripts/hello | 57 + guile18/examples/scripts/simple-hello.scm | 16 + guile18/guile-1.8.pc.in | 15 + guile18/guile-config/ChangeLog-2008 | 229 + guile18/guile-config/Makefile.am | 46 + guile18/guile-config/guile-config.in | 279 + guile18/guile-config/guile.m4 | 196 + guile18/guile-readline/ChangeLog-2008 | 722 + .../guile-readline/LIBGUILEREADLINE-VERSION | 14 + guile18/guile-readline/Makefile.am | 62 + guile18/guile-readline/autogen.sh | 8 + guile18/guile-readline/configure.in | 87 + guile18/guile-readline/ice-9/Makefile.am | 28 + guile18/guile-readline/ice-9/readline.scm | 243 + guile18/guile-readline/readline-activator.scm | 17 + guile18/guile-readline/readline.c | 569 + guile18/guile-readline/readline.h | 65 + guile18/guile-tools.in | 115 + guile18/ice-9/ChangeLog-2008 | 4824 ++++++ guile18/ice-9/Makefile.am | 68 + guile18/ice-9/README | 12 + guile18/ice-9/and-let-star.scm | 49 + guile18/ice-9/arrays.scm | 23 + guile18/ice-9/boot-9.scm | 3478 ++++ guile18/ice-9/buffered-input.scm | 112 + guile18/ice-9/calling.scm | 326 + guile18/ice-9/channel.scm | 170 + guile18/ice-9/common-list.scm | 278 + guile18/ice-9/compile-psyntax.scm | 27 + guile18/ice-9/debug.scm | 134 + guile18/ice-9/debugger.scm | 146 + guile18/ice-9/debugger/command-loop.scm | 542 + guile18/ice-9/debugger/commands.scm | 154 + guile18/ice-9/debugger/state.scm | 47 + guile18/ice-9/debugger/trc.scm | 63 + guile18/ice-9/debugger/utils.scm | 203 + guile18/ice-9/debugging/example-fns.scm | 17 + .../debugging/ice-9-debugger-extensions.scm | 173 + guile18/ice-9/debugging/steps.scm | 106 + guile18/ice-9/debugging/trace.scm | 157 + guile18/ice-9/debugging/traps.scm | 1037 ++ guile18/ice-9/debugging/trc.scm | 63 + guile18/ice-9/deprecated.scm | 180 + guile18/ice-9/documentation.scm | 213 + guile18/ice-9/emacs.scm | 276 + guile18/ice-9/expect.scm | 171 + guile18/ice-9/format.scm | 1690 ++ guile18/ice-9/ftw.scm | 380 + guile18/ice-9/gap-buffer.scm | 283 + guile18/ice-9/gds-client.scm | 592 + guile18/ice-9/gds-server.scm | 193 + guile18/ice-9/getopt-long.scm | 425 + guile18/ice-9/hcons.scm | 80 + guile18/ice-9/history.scm | 41 + guile18/ice-9/lineio.scm | 115 + guile18/ice-9/list.scm | 36 + guile18/ice-9/ls.scm | 96 + guile18/ice-9/mapping.scm | 128 + guile18/ice-9/match.scm | 199 + guile18/ice-9/networking.scm | 84 + guile18/ice-9/null.scm | 35 + guile18/ice-9/occam-channel.scm | 262 + guile18/ice-9/optargs.scm | 425 + guile18/ice-9/poe.scm | 122 + guile18/ice-9/popen.scm | 215 + guile18/ice-9/posix.scm | 69 + guile18/ice-9/pretty-print.scm | 278 + guile18/ice-9/psyntax.pp | 11 + guile18/ice-9/psyntax.ss | 2212 +++ guile18/ice-9/q.scm | 153 + guile18/ice-9/r4rs.scm | 213 + guile18/ice-9/r5rs.scm | 44 + guile18/ice-9/rdelim.scm | 172 + guile18/ice-9/receive.scm | 28 + guile18/ice-9/regex.scm | 238 + guile18/ice-9/runq.scm | 241 + guile18/ice-9/rw.scm | 27 + guile18/ice-9/safe-r5rs.scm | 144 + guile18/ice-9/safe.scm | 34 + guile18/ice-9/serialize.scm | 114 + guile18/ice-9/session.scm | 525 + guile18/ice-9/slib.scm | 42 + guile18/ice-9/stack-catch.scm | 43 + guile18/ice-9/streams.scm | 217 + guile18/ice-9/string-fun.scm | 279 + guile18/ice-9/syncase.scm | 249 + guile18/ice-9/test.scm | 1006 ++ guile18/ice-9/threads.scm | 221 + guile18/ice-9/time.scm | 58 + guile18/ice-9/weak-vector.scm | 31 + guile18/lang/Makefile.am | 68 + guile18/lang/elisp/ChangeLog-2008 | 401 + guile18/lang/elisp/README | 303 + guile18/lang/elisp/STATUS | 35 + guile18/lang/elisp/base.scm | 48 + guile18/lang/elisp/example.el | 39 + guile18/lang/elisp/interface.scm | 128 + guile18/lang/elisp/internals/evaluation.scm | 13 + guile18/lang/elisp/internals/format.scm | 62 + guile18/lang/elisp/internals/fset.scm | 113 + guile18/lang/elisp/internals/lambda.scm | 108 + guile18/lang/elisp/internals/load.scm | 44 + guile18/lang/elisp/internals/null.scm | 13 + guile18/lang/elisp/internals/set.scm | 20 + guile18/lang/elisp/internals/signal.scm | 18 + guile18/lang/elisp/internals/time.scm | 14 + guile18/lang/elisp/internals/trace.scm | 28 + guile18/lang/elisp/primitives/buffers.scm | 16 + guile18/lang/elisp/primitives/char-table.scm | 24 + guile18/lang/elisp/primitives/features.scm | 26 + guile18/lang/elisp/primitives/fns.scm | 45 + guile18/lang/elisp/primitives/format.scm | 6 + guile18/lang/elisp/primitives/guile.scm | 20 + guile18/lang/elisp/primitives/keymaps.scm | 26 + guile18/lang/elisp/primitives/lists.scm | 103 + guile18/lang/elisp/primitives/load.scm | 17 + guile18/lang/elisp/primitives/match.scm | 68 + guile18/lang/elisp/primitives/numbers.scm | 43 + guile18/lang/elisp/primitives/pure.scm | 8 + guile18/lang/elisp/primitives/read.scm | 10 + guile18/lang/elisp/primitives/signal.scm | 6 + guile18/lang/elisp/primitives/strings.scm | 40 + guile18/lang/elisp/primitives/symprop.scm | 40 + guile18/lang/elisp/primitives/syntax.scm | 266 + guile18/lang/elisp/primitives/system.scm | 14 + guile18/lang/elisp/primitives/time.scm | 17 + guile18/lang/elisp/transform.scm | 111 + guile18/lang/elisp/variables.scm | 42 + guile18/libguile.h | 131 + guile18/libguile/.gitignore | 15 + guile18/libguile/ChangeLog-1996-1999 | 9828 +++++++++++ guile18/libguile/ChangeLog-2000 | 5555 ++++++ guile18/libguile/ChangeLog-2008 | 14195 ++++++++++++++++ guile18/libguile/ChangeLog-gh | 256 + guile18/libguile/ChangeLog-scm | 2610 +++ guile18/libguile/ChangeLog-threads | 251 + guile18/libguile/Makefile.am | 397 + guile18/libguile/__scm.h | 641 + guile18/libguile/_scm.h | 164 + guile18/libguile/alist.c | 387 + guile18/libguile/alist.h | 53 + guile18/libguile/alloca.c | 499 + guile18/libguile/arbiters.c | 170 + guile18/libguile/arbiters.h | 40 + guile18/libguile/async.c | 493 + guile18/libguile/async.h | 94 + guile18/libguile/backtrace.c | 835 + guile18/libguile/backtrace.h | 49 + guile18/libguile/boolean.c | 81 + guile18/libguile/boolean.h | 54 + guile18/libguile/c-tokenize.lex | 200 + guile18/libguile/chars.c | 370 + guile18/libguile/chars.h | 73 + guile18/libguile/continuations.c | 427 + guile18/libguile/continuations.h | 108 + guile18/libguile/conv-integer.i.c | 149 + guile18/libguile/conv-uinteger.i.c | 118 + guile18/libguile/convert.c | 146 + guile18/libguile/convert.h | 50 + guile18/libguile/convert.i.c | 171 + guile18/libguile/coop-pthreads.c | 1040 ++ guile18/libguile/coop-pthreads.h | 81 + guile18/libguile/coop.c | 761 + guile18/libguile/cpp_cnvt.awk | 7 + guile18/libguile/cpp_err_symbols.in | 122 + guile18/libguile/cpp_errno.c | 9 + guile18/libguile/cpp_sig_symbols.in | 36 + guile18/libguile/cpp_signal.c | 9 + guile18/libguile/debug-malloc.c | 246 + guile18/libguile/debug-malloc.h | 44 + guile18/libguile/debug.c | 569 + guile18/libguile/debug.h | 194 + guile18/libguile/deprecated.c | 1505 ++ guile18/libguile/deprecated.h | 588 + guile18/libguile/deprecation.c | 173 + guile18/libguile/deprecation.h | 46 + guile18/libguile/discouraged.c | 306 + guile18/libguile/discouraged.h | 183 + guile18/libguile/dynl.c | 330 + guile18/libguile/dynl.h | 44 + guile18/libguile/dynwind.c | 387 + guile18/libguile/dynwind.h | 78 + guile18/libguile/environments.c | 2349 +++ guile18/libguile/environments.h | 188 + guile18/libguile/eq.c | 322 + guile18/libguile/eq.h | 40 + guile18/libguile/error.c | 283 + guile18/libguile/error.h | 68 + guile18/libguile/eval.c | 6077 +++++++ guile18/libguile/eval.h | 228 + guile18/libguile/evalext.c | 134 + guile18/libguile/evalext.h | 45 + guile18/libguile/extensions.c | 167 + guile18/libguile/extensions.h | 43 + guile18/libguile/feature.c | 132 + guile18/libguile/feature.h | 39 + guile18/libguile/filesys.c | 1757 ++ guile18/libguile/filesys.h | 76 + guile18/libguile/fluids.c | 631 + guile18/libguile/fluids.h | 96 + guile18/libguile/fports.c | 943 + guile18/libguile/fports.h | 71 + guile18/libguile/futures.c | 379 + guile18/libguile/futures.h | 90 + guile18/libguile/gc-card.c | 473 + guile18/libguile/gc-freelist.c | 198 + guile18/libguile/gc-malloc.c | 497 + guile18/libguile/gc-mark.c | 511 + guile18/libguile/gc-segment.c | 571 + guile18/libguile/gc.c | 1094 ++ guile18/libguile/gc.h | 429 + guile18/libguile/gc_os_dep.c | 1957 +++ guile18/libguile/gdb_interface.h | 153 + guile18/libguile/gdbint.c | 295 + guile18/libguile/gdbint.h | 39 + guile18/libguile/gen-scmconfig.c | 409 + guile18/libguile/gen-scmconfig.h.in | 39 + guile18/libguile/gettext.h | 69 + guile18/libguile/gh.h | 243 + guile18/libguile/gh_data.c | 659 + guile18/libguile/gh_eval.c | 109 + guile18/libguile/gh_funcs.c | 157 + guile18/libguile/gh_init.c | 94 + guile18/libguile/gh_io.c | 50 + guile18/libguile/gh_list.c | 181 + guile18/libguile/gh_predicates.c | 124 + guile18/libguile/goops.c | 3040 ++++ guile18/libguile/goops.h | 320 + guile18/libguile/gsubr.c | 273 + guile18/libguile/gsubr.h | 62 + guile18/libguile/guardians.c | 356 + guile18/libguile/guardians.h | 41 + guile18/libguile/guile-doc-snarf.in | 35 + guile18/libguile/guile-func-name-check.in | 65 + guile18/libguile/guile-snarf-docs.in | 26 + guile18/libguile/guile-snarf.awk.in | 146 + guile18/libguile/guile-snarf.in | 96 + guile18/libguile/guile.c | 71 + guile18/libguile/hash.c | 269 + guile18/libguile/hash.h | 45 + guile18/libguile/hashtab.c | 1089 ++ guile18/libguile/hashtab.h | 144 + guile18/libguile/hooks.c | 305 + guile18/libguile/hooks.h | 98 + guile18/libguile/i18n.c | 326 + guile18/libguile/i18n.h | 41 + guile18/libguile/inet_aton.c | 174 + guile18/libguile/init.c | 568 + guile18/libguile/init.h | 50 + guile18/libguile/inline.c | 23 + guile18/libguile/inline.h | 381 + guile18/libguile/ioext.c | 309 + guile18/libguile/ioext.h | 46 + guile18/libguile/iselect.h | 72 + guile18/libguile/keywords.c | 129 + guile18/libguile/keywords.h | 49 + guile18/libguile/lang.c | 54 + guile18/libguile/lang.h | 49 + guile18/libguile/list.c | 945 + guile18/libguile/list.h | 83 + guile18/libguile/load.c | 533 + guile18/libguile/load.h | 47 + guile18/libguile/macros.c | 252 + guile18/libguile/macros.h | 61 + guile18/libguile/mallocs.c | 86 + guile18/libguile/mallocs.h | 45 + guile18/libguile/measure-hwm.scm | 136 + guile18/libguile/memmove.c | 28 + guile18/libguile/mkstemp.c | 129 + guile18/libguile/modules.c | 684 + guile18/libguile/modules.h | 119 + guile18/libguile/net_db.c | 463 + guile18/libguile/net_db.h | 45 + guile18/libguile/null-threads.c | 72 + guile18/libguile/null-threads.h | 107 + guile18/libguile/numbers.c | 6232 +++++++ guile18/libguile/numbers.h | 487 + guile18/libguile/objects.c | 363 + guile18/libguile/objects.h | 218 + guile18/libguile/objprop.c | 105 + guile18/libguile/objprop.h | 41 + guile18/libguile/options.c | 276 + guile18/libguile/options.h | 53 + guile18/libguile/pairs.c | 208 + guile18/libguile/pairs.h | 159 + guile18/libguile/ports.c | 1760 ++ guile18/libguile/ports.h | 315 + guile18/libguile/posix.c | 2114 +++ guile18/libguile/posix.h | 96 + guile18/libguile/print.c | 1201 ++ guile18/libguile/print.h | 116 + guile18/libguile/private-gc.h | 263 + guile18/libguile/procprop.c | 244 + guile18/libguile/procprop.h | 48 + guile18/libguile/procs.c | 370 + guile18/libguile/procs.h | 170 + guile18/libguile/properties.c | 139 + guile18/libguile/properties.h | 40 + guile18/libguile/pthread-threads.h | 100 + guile18/libguile/putenv.c | 126 + guile18/libguile/quicksort.i.c | 243 + guile18/libguile/ramap.c | 1238 ++ guile18/libguile/ramap.h | 58 + guile18/libguile/random.c | 615 + guile18/libguile/random.h | 115 + guile18/libguile/rdelim.c | 282 + guile18/libguile/rdelim.h | 41 + guile18/libguile/read.c | 1298 ++ guile18/libguile/read.h | 83 + guile18/libguile/regex-posix.c | 317 + guile18/libguile/regex-posix.h | 42 + guile18/libguile/remaining-docs-needed | 2 + guile18/libguile/root.c | 201 + guile18/libguile/root.h | 66 + guile18/libguile/run-test | 4 + guile18/libguile/rw.c | 287 + guile18/libguile/rw.h | 41 + guile18/libguile/scmconfig.h.top | 16 + guile18/libguile/scmsigs.c | 701 + guile18/libguile/scmsigs.h | 50 + guile18/libguile/script.c | 752 + guile18/libguile/script.h | 47 + guile18/libguile/simpos.c | 241 + guile18/libguile/simpos.h | 42 + guile18/libguile/smob.c | 520 + guile18/libguile/smob.h | 163 + guile18/libguile/snarf.h | 284 + guile18/libguile/socket.c | 1809 ++ guile18/libguile/socket.h | 73 + guile18/libguile/sort.c | 596 + guile18/libguile/sort.h | 50 + guile18/libguile/srcprop.c | 346 + guile18/libguile/srcprop.h | 85 + guile18/libguile/srfi-13.c | 3585 ++++ guile18/libguile/srfi-13.h | 119 + guile18/libguile/srfi-14.c | 1572 ++ guile18/libguile/srfi-14.h | 112 + guile18/libguile/srfi-4.c | 1006 ++ guile18/libguile/srfi-4.h | 319 + guile18/libguile/srfi-4.i.c | 210 + guile18/libguile/stackchk.c | 103 + guile18/libguile/stackchk.h | 72 + guile18/libguile/stacks.c | 759 + guile18/libguile/stacks.h | 117 + guile18/libguile/stime.c | 815 + guile18/libguile/stime.h | 75 + guile18/libguile/strerror.c | 34 + guile18/libguile/strings.c | 1111 ++ guile18/libguile/strings.h | 179 + guile18/libguile/strorder.c | 169 + guile18/libguile/strorder.h | 47 + guile18/libguile/strports.c | 565 + guile18/libguile/strports.h | 66 + guile18/libguile/struct.c | 927 + guile18/libguile/struct.h | 117 + guile18/libguile/symbols.c | 452 + guile18/libguile/symbols.h | 76 + guile18/libguile/tags.h | 697 + guile18/libguile/threads.c | 1760 ++ guile18/libguile/threads.h | 226 + guile18/libguile/throw.c | 855 + guile18/libguile/throw.h | 105 + guile18/libguile/unif.c | 2957 ++++ guile18/libguile/unif.h | 194 + guile18/libguile/validate.h | 391 + guile18/libguile/values.c | 98 + guile18/libguile/values.h | 41 + guile18/libguile/variable.c | 135 + guile18/libguile/variable.h | 56 + guile18/libguile/vectors.c | 669 + guile18/libguile/vectors.h | 112 + guile18/libguile/version.c | 143 + guile18/libguile/version.h.in | 47 + guile18/libguile/vports.c | 235 + guile18/libguile/vports.h | 38 + guile18/libguile/weaks.c | 378 + guile18/libguile/weaks.h | 79 + guile18/libguile/win32-dirent.c | 132 + guile18/libguile/win32-dirent.h | 64 + guile18/libguile/win32-socket.c | 631 + guile18/libguile/win32-socket.h | 41 + guile18/libguile/win32-uname.c | 145 + guile18/libguile/win32-uname.h | 51 + guile18/m4/.gitignore | 2 + guile18/m4/autobuild.m4 | 39 + guile18/oop/ChangeLog-2008 | 295 + guile18/oop/Makefile.am | 33 + guile18/oop/goops.scm | 1715 ++ guile18/oop/goops/Makefile.am | 34 + guile18/oop/goops/accessors.scm | 81 + guile18/oop/goops/active-slot.scm | 66 + guile18/oop/goops/compile.scm | 139 + guile18/oop/goops/composite-slot.scm | 82 + guile18/oop/goops/describe.scm | 200 + guile18/oop/goops/dispatch.scm | 266 + guile18/oop/goops/internal.scm | 25 + guile18/oop/goops/old-define-method.scm | 60 + guile18/oop/goops/save.scm | 874 + guile18/oop/goops/simple.scm | 28 + guile18/oop/goops/stklos.scm | 97 + guile18/oop/goops/util.scm | 71 + guile18/pre-inst-guile-env.in | 81 + guile18/pre-inst-guile.in | 99 + guile18/qt/CHANGES | 15 + guile18/qt/ChangeLog-2008 | 283 + guile18/qt/Makefile.am | 54 + guile18/qt/Makefile.base | 112 + guile18/qt/README | 89 + guile18/qt/README.MISC | 56 + guile18/qt/README.PORT | 112 + guile18/qt/b.h | 11 + guile18/qt/config | 308 + guile18/qt/copyright.h | 12 + guile18/qt/libqthreads.def | 10 + guile18/qt/md/Makefile.am | 30 + guile18/qt/md/_sparc.s | 142 + guile18/qt/md/_sparc_b.s | 106 + guile18/qt/md/arm.h | 96 + guile18/qt/md/arm.s | 34 + guile18/qt/md/axp.1.Makefile | 5 + guile18/qt/md/axp.2.Makefile | 5 + guile18/qt/md/axp.Makefile | 5 + guile18/qt/md/axp.README | 10 + guile18/qt/md/axp.c | 133 + guile18/qt/md/axp.h | 160 + guile18/qt/md/axp.s | 160 + guile18/qt/md/axp_b.s | 111 + guile18/qt/md/default.Makefile | 6 + guile18/qt/md/hppa-cnx.Makefile | 9 + guile18/qt/md/hppa.Makefile | 9 + guile18/qt/md/hppa.h | 194 + guile18/qt/md/hppa.s | 237 + guile18/qt/md/hppa_b.s | 203 + guile18/qt/md/i386.README | 7 + guile18/qt/md/i386.asm | 112 + guile18/qt/md/i386.h | 120 + guile18/qt/md/i386.s | 108 + guile18/qt/md/i386_b.s | 30 + guile18/qt/md/ksr1.Makefile | 6 + guile18/qt/md/ksr1.h | 164 + guile18/qt/md/ksr1.s | 424 + guile18/qt/md/ksr1_b.s | 49 + guile18/qt/md/m88k.Makefile | 6 + guile18/qt/md/m88k.c | 111 + guile18/qt/md/m88k.h | 159 + guile18/qt/md/m88k.s | 132 + guile18/qt/md/m88k_b.s | 117 + guile18/qt/md/mips-irix5.s | 182 + guile18/qt/md/mips.h | 134 + guile18/qt/md/mips.s | 164 + guile18/qt/md/mips_b.s | 99 + guile18/qt/md/null.README | 0 guile18/qt/md/null.c | 14 + guile18/qt/md/solaris.README | 19 + guile18/qt/md/sparc.h | 140 + guile18/qt/md/sparc.s | 142 + guile18/qt/md/sparc_b.s | 106 + guile18/qt/md/vax.h | 130 + guile18/qt/md/vax.s | 69 + guile18/qt/md/vax_b.s | 92 + guile18/qt/meas.c | 1049 ++ guile18/qt/qt.c | 48 + guile18/qt/qt.h.in | 186 + guile18/qt/stp.c | 199 + guile18/qt/stp.h | 51 + guile18/qt/time/Makefile.am | 24 + guile18/qt/time/README.time | 17 + guile18/qt/time/assim | 42 + guile18/qt/time/cswap | 37 + guile18/qt/time/go | 43 + guile18/qt/time/init | 42 + guile18/qt/time/prim | 41 + guile18/qt/time/raw | 58 + guile18/scripts/ChangeLog-2008 | 319 + guile18/scripts/Makefile.am | 68 + guile18/scripts/PROGRAM | 45 + guile18/scripts/README | 76 + guile18/scripts/api-diff | 181 + guile18/scripts/autofrisk | 221 + guile18/scripts/display-commentary | 70 + guile18/scripts/doc-snarf | 442 + guile18/scripts/frisk | 292 + guile18/scripts/generate-autoload | 146 + guile18/scripts/lint | 320 + guile18/scripts/punify | 89 + guile18/scripts/read-rfc822 | 133 + guile18/scripts/read-scheme-source | 284 + guile18/scripts/read-text-outline | 255 + guile18/scripts/scan-api | 225 + guile18/scripts/snarf-check-and-output-texi | 324 + guile18/scripts/snarf-guile-m4-docs | 88 + guile18/scripts/summarize-guile-TODO | 215 + guile18/scripts/use2dot | 113 + guile18/srfi/ChangeLog-2008 | 1319 ++ guile18/srfi/Makefile.am | 97 + guile18/srfi/README | 100 + guile18/srfi/srfi-1.c | 2231 +++ guile18/srfi/srfi-1.h | 91 + guile18/srfi/srfi-1.scm | 588 + guile18/srfi/srfi-10.scm | 89 + guile18/srfi/srfi-11.scm | 254 + guile18/srfi/srfi-13.c | 43 + guile18/srfi/srfi-13.h | 56 + guile18/srfi/srfi-13.scm | 132 + guile18/srfi/srfi-14.c | 37 + guile18/srfi/srfi-14.h | 38 + guile18/srfi/srfi-14.scm | 99 + guile18/srfi/srfi-16.scm | 126 + guile18/srfi/srfi-17.scm | 174 + guile18/srfi/srfi-19.scm | 1545 ++ guile18/srfi/srfi-2.scm | 31 + guile18/srfi/srfi-26.scm | 49 + guile18/srfi/srfi-31.scm | 35 + guile18/srfi/srfi-34.scm | 80 + guile18/srfi/srfi-35.scm | 345 + guile18/srfi/srfi-37.scm | 230 + guile18/srfi/srfi-39.scm | 137 + guile18/srfi/srfi-4.c | 38 + guile18/srfi/srfi-4.h | 27 + guile18/srfi/srfi-4.scm | 71 + guile18/srfi/srfi-6.scm | 33 + guile18/srfi/srfi-60.c | 421 + guile18/srfi/srfi-60.h | 45 + guile18/srfi/srfi-60.scm | 72 + guile18/srfi/srfi-69.scm | 329 + guile18/srfi/srfi-8.scm | 31 + guile18/srfi/srfi-88.scm | 50 + guile18/srfi/srfi-9.scm | 91 + guile18/test-suite/ChangeLog-2008 | 2604 +++ guile18/test-suite/Makefile.am | 111 + guile18/test-suite/README | 47 + guile18/test-suite/guile-test | 241 + guile18/test-suite/lib.scm | 559 + guile18/test-suite/standalone/.gitignore | 12 + guile18/test-suite/standalone/Makefile.am | 159 + guile18/test-suite/standalone/README | 29 + guile18/test-suite/standalone/test-asmobs | 118 + .../test-suite/standalone/test-asmobs-lib.c | 208 + .../standalone/test-bad-identifiers | 77 + .../test-suite/standalone/test-conversion.c | 1101 ++ .../standalone/test-fast-slot-ref.in | 39 + guile18/test-suite/standalone/test-gh.c | 95 + guile18/test-suite/standalone/test-list.c | 64 + .../test-suite/standalone/test-num2integral.c | 170 + .../standalone/test-require-extension | 18 + guile18/test-suite/standalone/test-round.c | 136 + .../test-suite/standalone/test-scm-c-read.c | 130 + .../standalone/test-scm-take-locale-symbol.c | 63 + .../standalone/test-scm-with-guile.c | 66 + .../test-suite/standalone/test-system-cmds | 42 + guile18/test-suite/standalone/test-unwind.c | 317 + .../test-suite/standalone/test-use-srfi.in | 67 + .../standalone/test-with-guile-module.c | 81 + guile18/test-suite/tests/alist.test | 244 + guile18/test-suite/tests/and-let-star.test | 78 + guile18/test-suite/tests/arbiters.test | 102 + guile18/test-suite/tests/bit-operations.test | 364 + guile18/test-suite/tests/c-api.test | 46 + guile18/test-suite/tests/c-api/Makefile | 16 + guile18/test-suite/tests/c-api/README | 11 + guile18/test-suite/tests/c-api/strings.c | 74 + guile18/test-suite/tests/c-api/testlib.c | 121 + guile18/test-suite/tests/c-api/testlib.h | 28 + guile18/test-suite/tests/chars.test | 45 + guile18/test-suite/tests/common-list.test | 219 + guile18/test-suite/tests/continuations.test | 68 + guile18/test-suite/tests/dynamic-scope.test | 91 + guile18/test-suite/tests/elisp.test | 334 + guile18/test-suite/tests/environments.test | 1045 ++ guile18/test-suite/tests/eval.test | 413 + guile18/test-suite/tests/exceptions.test | 478 + guile18/test-suite/tests/filesys.test | 129 + guile18/test-suite/tests/format.test | 100 + guile18/test-suite/tests/fractions.test | 403 + guile18/test-suite/tests/ftw.test | 73 + guile18/test-suite/tests/gc.test | 80 + guile18/test-suite/tests/getopt-long.test | 274 + guile18/test-suite/tests/goops.test | 481 + guile18/test-suite/tests/guardians.test | 271 + guile18/test-suite/tests/hash.test | 288 + guile18/test-suite/tests/hooks.test | 124 + guile18/test-suite/tests/import.test | 51 + guile18/test-suite/tests/interp.test | 53 + guile18/test-suite/tests/list.test | 692 + guile18/test-suite/tests/load.test | 128 + guile18/test-suite/tests/modules.test | 50 + guile18/test-suite/tests/multilingual.nottest | 81 + guile18/test-suite/tests/numbers.test | 3232 ++++ guile18/test-suite/tests/optargs.test | 118 + guile18/test-suite/tests/options.test | 30 + guile18/test-suite/tests/pairs.test | 131 + guile18/test-suite/tests/poe.test | 139 + guile18/test-suite/tests/popen.test | 210 + guile18/test-suite/tests/ports.test | 745 + guile18/test-suite/tests/posix.test | 164 + guile18/test-suite/tests/procprop.test | 61 + guile18/test-suite/tests/q.test | 93 + guile18/test-suite/tests/r4rs.test | 1006 ++ guile18/test-suite/tests/r5rs_pitfall.test | 311 + guile18/test-suite/tests/ramap.test | 186 + guile18/test-suite/tests/reader.test | 196 + guile18/test-suite/tests/receive.test | 32 + guile18/test-suite/tests/regexp.test | 250 + guile18/test-suite/tests/signals.test | 29 + guile18/test-suite/tests/socket.test | 425 + guile18/test-suite/tests/sort.test | 78 + guile18/test-suite/tests/srcprop.test | 55 + guile18/test-suite/tests/srfi-1.test | 2592 +++ guile18/test-suite/tests/srfi-10.test | 30 + guile18/test-suite/tests/srfi-11.test | 133 + guile18/test-suite/tests/srfi-13.test | 1579 ++ guile18/test-suite/tests/srfi-14.test | 317 + guile18/test-suite/tests/srfi-17.test | 88 + guile18/test-suite/tests/srfi-19.test | 197 + guile18/test-suite/tests/srfi-26.test | 74 + guile18/test-suite/tests/srfi-31.test | 38 + guile18/test-suite/tests/srfi-34.test | 184 + guile18/test-suite/tests/srfi-35.test | 324 + guile18/test-suite/tests/srfi-37.test | 109 + guile18/test-suite/tests/srfi-39.test | 132 + guile18/test-suite/tests/srfi-4.test | 313 + guile18/test-suite/tests/srfi-6.test | 85 + guile18/test-suite/tests/srfi-60.test | 436 + guile18/test-suite/tests/srfi-69.test | 108 + guile18/test-suite/tests/srfi-88.test | 59 + guile18/test-suite/tests/srfi-9.test | 82 + guile18/test-suite/tests/streams.test | 79 + guile18/test-suite/tests/strings.test | 259 + guile18/test-suite/tests/structs.test | 161 + guile18/test-suite/tests/symbols.test | 90 + guile18/test-suite/tests/syncase.test | 39 + guile18/test-suite/tests/syntax.test | 1196 ++ guile18/test-suite/tests/threads.test | 168 + guile18/test-suite/tests/time.test | 290 + guile18/test-suite/tests/unif.test | 560 + guile18/test-suite/tests/version.test | 33 + guile18/test-suite/tests/weaks.test | 189 + 835 files changed, 302533 insertions(+) create mode 100644 guile18/.gitignore create mode 100644 guile18/ABOUT-NLS create mode 100644 guile18/ANNOUNCE create mode 100644 guile18/AUTHORS create mode 100644 guile18/COPYING.LESSER create mode 100644 guile18/ChangeLog create mode 100644 guile18/ChangeLog-2008 create mode 100644 guile18/GUILE-VERSION create mode 100644 guile18/HACKING create mode 100644 guile18/LICENSE create mode 100644 guile18/Makefile.am create mode 100644 guile18/NEWS create mode 100644 guile18/README create mode 100644 guile18/THANKS create mode 100644 guile18/acinclude.m4 create mode 100644 guile18/am/ChangeLog-2008 create mode 100644 guile18/am/Makefile.am create mode 100644 guile18/am/README create mode 100644 guile18/am/maintainer-dirs create mode 100644 guile18/am/pre-inst-guile create mode 100755 guile18/autogen.sh create mode 100644 guile18/benchmark-guile.in create mode 100644 guile18/benchmark-suite/ChangeLog-2008 create mode 100644 guile18/benchmark-suite/Makefile.am create mode 100644 guile18/benchmark-suite/README create mode 100644 guile18/benchmark-suite/benchmarks/0-reference.bm create mode 100644 guile18/benchmark-suite/benchmarks/continuations.bm create mode 100644 guile18/benchmark-suite/benchmarks/if.bm create mode 100644 guile18/benchmark-suite/benchmarks/logand.bm create mode 100644 guile18/benchmark-suite/benchmarks/read.bm create mode 100644 guile18/benchmark-suite/benchmarks/subr.bm create mode 100644 guile18/benchmark-suite/benchmarks/uniform-vector-read.bm create mode 100755 guile18/benchmark-suite/guile-benchmark create mode 100644 guile18/benchmark-suite/lib.scm create mode 100755 guile18/build-aux/config.rpath create mode 100644 guile18/check-guile.in create mode 100755 guile18/config.rpath create mode 100644 guile18/configure.in create mode 100644 guile18/doc/.gitignore create mode 100644 guile18/doc/ChangeLog-2008 create mode 100644 guile18/doc/ChangeLog-guile-doc create mode 100644 guile18/doc/Makefile.am create mode 100644 guile18/doc/NEWS create mode 100644 guile18/doc/README create mode 100644 guile18/doc/THANKS create mode 100644 guile18/doc/example-smob/ChangeLog-2008 create mode 100644 guile18/doc/example-smob/README create mode 100644 guile18/doc/example-smob/image-type.c create mode 100644 guile18/doc/example-smob/image-type.h create mode 100644 guile18/doc/example-smob/myguile.c create mode 100644 guile18/doc/goops/ChangeLog-2008 create mode 100644 guile18/doc/goops/Makefile.am create mode 100644 guile18/doc/goops/goops-tutorial.texi create mode 100644 guile18/doc/goops/goops.texi create mode 100644 guile18/doc/goops/hierarchy.eps create mode 100644 guile18/doc/goops/hierarchy.pdf create mode 100644 guile18/doc/goops/hierarchy.png create mode 100644 guile18/doc/goops/hierarchy.txt create mode 100644 guile18/doc/goops/mop.text create mode 100644 guile18/doc/groupings.alist create mode 100644 guile18/doc/guile-api.alist create mode 100644 guile18/doc/guile.1 create mode 100644 guile18/doc/hacks.el create mode 100644 guile18/doc/maint/ChangeLog-2008 create mode 100644 guile18/doc/maint/README create mode 100644 guile18/doc/maint/docstring.el create mode 100644 guile18/doc/mbapi.texi create mode 100644 guile18/doc/mltext.texi create mode 100644 guile18/doc/oldfmt.c create mode 100644 guile18/doc/r5rs/ChangeLog-2008 create mode 100644 guile18/doc/r5rs/Makefile.am create mode 100644 guile18/doc/r5rs/r5rs.texi create mode 100644 guile18/doc/recipe-guidelines.txt create mode 100644 guile18/doc/ref/.gitignore create mode 100644 guile18/doc/ref/ChangeLog-2008 create mode 100644 guile18/doc/ref/ChangeLog-guile-doc-ref create mode 100644 guile18/doc/ref/Makefile.am create mode 100644 guile18/doc/ref/api-binding.texi create mode 100644 guile18/doc/ref/api-compound.texi create mode 100644 guile18/doc/ref/api-control.texi create mode 100755 guile18/doc/ref/api-data.texi create mode 100644 guile18/doc/ref/api-debug.texi create mode 100644 guile18/doc/ref/api-evaluation.texi create mode 100644 guile18/doc/ref/api-i18n.texi create mode 100644 guile18/doc/ref/api-init.texi create mode 100644 guile18/doc/ref/api-io.texi create mode 100644 guile18/doc/ref/api-memory.texi create mode 100644 guile18/doc/ref/api-options.texi create mode 100644 guile18/doc/ref/api-overview.texi create mode 100644 guile18/doc/ref/api-procedures.texi create mode 100644 guile18/doc/ref/api-scheduling.texi create mode 100644 guile18/doc/ref/api-scm.texi create mode 100644 guile18/doc/ref/api-smobs.texi create mode 100644 guile18/doc/ref/api-snarf.texi create mode 100644 guile18/doc/ref/api-translation.texi create mode 100644 guile18/doc/ref/api-undocumented.texi create mode 100644 guile18/doc/ref/api-utility.texi create mode 100644 guile18/doc/ref/api.txt create mode 100644 guile18/doc/ref/autoconf.texi create mode 100644 guile18/doc/ref/data-rep.texi create mode 100644 guile18/doc/ref/expect.texi create mode 100644 guile18/doc/ref/extend.texi create mode 100644 guile18/doc/ref/fdl.texi create mode 100644 guile18/doc/ref/gh.texi create mode 100644 guile18/doc/ref/indices.texi create mode 100644 guile18/doc/ref/libguile-concepts.texi create mode 100644 guile18/doc/ref/libguile-extensions.texi create mode 100644 guile18/doc/ref/libguile-linking.texi create mode 100644 guile18/doc/ref/libguile-program.texi create mode 100644 guile18/doc/ref/libguile-smobs.texi create mode 100644 guile18/doc/ref/libguile-snarf.texi create mode 100644 guile18/doc/ref/misc-modules.texi create mode 100644 guile18/doc/ref/mod-getopt-long.texi create mode 100644 guile18/doc/ref/new-docstrings.texi create mode 100644 guile18/doc/ref/preface.texi create mode 100644 guile18/doc/ref/repl-modules.texi create mode 100644 guile18/doc/ref/scheme-debugging.texi create mode 100644 guile18/doc/ref/scheme-ideas.texi create mode 100644 guile18/doc/ref/scheme-indices.texi create mode 100644 guile18/doc/ref/scheme-intro.texi create mode 100644 guile18/doc/ref/scheme-reading.texi create mode 100644 guile18/doc/ref/scheme-scripts.texi create mode 100644 guile18/doc/ref/script-getopt.texi create mode 100644 guile18/doc/ref/scsh.texi create mode 100644 guile18/doc/ref/slib.texi create mode 100644 guile18/doc/ref/srfi-modules.texi create mode 100644 guile18/doc/ref/tcltk.texi create mode 100644 guile18/doc/ref/tools.texi create mode 100644 guile18/doc/sources/ChangeLog-2008 create mode 100644 guile18/doc/sources/Makefile.am create mode 100644 guile18/doc/sources/contributors.texi create mode 100644 guile18/doc/sources/debug-c.texi create mode 100644 guile18/doc/sources/debug-scheme.texi create mode 100644 guile18/doc/sources/env.texi create mode 100644 guile18/doc/sources/format.texi create mode 100644 guile18/doc/sources/guile-slib.texi create mode 100644 guile18/doc/sources/jimb-org.texi create mode 100644 guile18/doc/sources/libguile-overview.texi create mode 100644 guile18/doc/sources/libguile-tools.texi create mode 100644 guile18/doc/sources/new-types.texi create mode 100644 guile18/doc/sources/old-intro.texi create mode 100644 guile18/doc/sources/sample-APIs.texi create mode 100644 guile18/doc/sources/scheme-concepts.texi create mode 100644 guile18/doc/sources/scm-ref.texi create mode 100644 guile18/doc/sources/strings.texi create mode 100644 guile18/doc/sources/tk.texi create mode 100644 guile18/doc/sources/unix-other.texi create mode 100644 guile18/doc/sources/unix.texi create mode 100644 guile18/doc/tutorial/ChangeLog-2008 create mode 100644 guile18/doc/tutorial/ChangeLog-guile-doc-tutorial create mode 100644 guile18/doc/tutorial/Makefile.am create mode 100644 guile18/doc/tutorial/guile-tut.texi create mode 100644 guile18/doc/use-cases.fig create mode 100644 guile18/doc/use-cases.txt create mode 100644 guile18/emacs/ChangeLog-2008 create mode 100644 guile18/emacs/Makefile.am create mode 100644 guile18/emacs/README create mode 100755 guile18/emacs/gds-scheme.el create mode 100644 guile18/emacs/gds-server.el create mode 100644 guile18/emacs/gds.el create mode 100644 guile18/emacs/gud-guile.el create mode 100644 guile18/emacs/guile-c.el create mode 100644 guile18/emacs/guile-emacs.scm create mode 100644 guile18/emacs/guile-scheme.el create mode 100644 guile18/emacs/guile.el create mode 100644 guile18/emacs/multistring.el create mode 100644 guile18/emacs/patch.el create mode 100644 guile18/emacs/ppexpand.el create mode 100644 guile18/emacs/update-changelog.el create mode 100644 guile18/examples/ChangeLog-2008 create mode 100644 guile18/examples/Makefile.am create mode 100644 guile18/examples/README create mode 100644 guile18/examples/box-dynamic-module/README create mode 100644 guile18/examples/box-dynamic-module/box-mixed.scm create mode 100644 guile18/examples/box-dynamic-module/box-module.scm create mode 100644 guile18/examples/box-dynamic-module/box.c create mode 100644 guile18/examples/box-dynamic/README create mode 100644 guile18/examples/box-dynamic/box.c create mode 100644 guile18/examples/box-module/README create mode 100644 guile18/examples/box-module/box.c create mode 100644 guile18/examples/box/README create mode 100644 guile18/examples/box/box.c create mode 100755 guile18/examples/check.test create mode 100644 guile18/examples/compat/acconfig.h create mode 100644 guile18/examples/compat/acinclude.m4 create mode 100644 guile18/examples/compat/compat.h create mode 100644 guile18/examples/compat/configure.in create mode 100644 guile18/examples/modules/README create mode 100644 guile18/examples/modules/main create mode 100644 guile18/examples/modules/module-0.scm create mode 100644 guile18/examples/modules/module-1.scm create mode 100644 guile18/examples/modules/module-2.scm create mode 100644 guile18/examples/safe/README create mode 100644 guile18/examples/safe/evil.scm create mode 100755 guile18/examples/safe/safe create mode 100644 guile18/examples/safe/untrusted.scm create mode 100644 guile18/examples/scripts/README create mode 100755 guile18/examples/scripts/fact create mode 100755 guile18/examples/scripts/hello create mode 100644 guile18/examples/scripts/simple-hello.scm create mode 100644 guile18/guile-1.8.pc.in create mode 100644 guile18/guile-config/ChangeLog-2008 create mode 100644 guile18/guile-config/Makefile.am create mode 100644 guile18/guile-config/guile-config.in create mode 100644 guile18/guile-config/guile.m4 create mode 100644 guile18/guile-readline/ChangeLog-2008 create mode 100644 guile18/guile-readline/LIBGUILEREADLINE-VERSION create mode 100644 guile18/guile-readline/Makefile.am create mode 100755 guile18/guile-readline/autogen.sh create mode 100644 guile18/guile-readline/configure.in create mode 100644 guile18/guile-readline/ice-9/Makefile.am create mode 100644 guile18/guile-readline/ice-9/readline.scm create mode 100644 guile18/guile-readline/readline-activator.scm create mode 100644 guile18/guile-readline/readline.c create mode 100644 guile18/guile-readline/readline.h create mode 100644 guile18/guile-tools.in create mode 100644 guile18/ice-9/ChangeLog-2008 create mode 100644 guile18/ice-9/Makefile.am create mode 100644 guile18/ice-9/README create mode 100644 guile18/ice-9/and-let-star.scm create mode 100644 guile18/ice-9/arrays.scm create mode 100644 guile18/ice-9/boot-9.scm create mode 100644 guile18/ice-9/buffered-input.scm create mode 100644 guile18/ice-9/calling.scm create mode 100644 guile18/ice-9/channel.scm create mode 100644 guile18/ice-9/common-list.scm create mode 100644 guile18/ice-9/compile-psyntax.scm create mode 100644 guile18/ice-9/debug.scm create mode 100644 guile18/ice-9/debugger.scm create mode 100644 guile18/ice-9/debugger/command-loop.scm create mode 100644 guile18/ice-9/debugger/commands.scm create mode 100644 guile18/ice-9/debugger/state.scm create mode 100644 guile18/ice-9/debugger/trc.scm create mode 100644 guile18/ice-9/debugger/utils.scm create mode 100644 guile18/ice-9/debugging/example-fns.scm create mode 100644 guile18/ice-9/debugging/ice-9-debugger-extensions.scm create mode 100644 guile18/ice-9/debugging/steps.scm create mode 100644 guile18/ice-9/debugging/trace.scm create mode 100755 guile18/ice-9/debugging/traps.scm create mode 100644 guile18/ice-9/debugging/trc.scm create mode 100644 guile18/ice-9/deprecated.scm create mode 100644 guile18/ice-9/documentation.scm create mode 100644 guile18/ice-9/emacs.scm create mode 100644 guile18/ice-9/expect.scm create mode 100644 guile18/ice-9/format.scm create mode 100644 guile18/ice-9/ftw.scm create mode 100644 guile18/ice-9/gap-buffer.scm create mode 100755 guile18/ice-9/gds-client.scm create mode 100644 guile18/ice-9/gds-server.scm create mode 100644 guile18/ice-9/getopt-long.scm create mode 100644 guile18/ice-9/hcons.scm create mode 100644 guile18/ice-9/history.scm create mode 100644 guile18/ice-9/lineio.scm create mode 100644 guile18/ice-9/list.scm create mode 100644 guile18/ice-9/ls.scm create mode 100644 guile18/ice-9/mapping.scm create mode 100644 guile18/ice-9/match.scm create mode 100644 guile18/ice-9/networking.scm create mode 100644 guile18/ice-9/null.scm create mode 100644 guile18/ice-9/occam-channel.scm create mode 100644 guile18/ice-9/optargs.scm create mode 100644 guile18/ice-9/poe.scm create mode 100644 guile18/ice-9/popen.scm create mode 100644 guile18/ice-9/posix.scm create mode 100644 guile18/ice-9/pretty-print.scm create mode 100644 guile18/ice-9/psyntax.pp create mode 100644 guile18/ice-9/psyntax.ss create mode 100644 guile18/ice-9/q.scm create mode 100644 guile18/ice-9/r4rs.scm create mode 100644 guile18/ice-9/r5rs.scm create mode 100644 guile18/ice-9/rdelim.scm create mode 100644 guile18/ice-9/receive.scm create mode 100644 guile18/ice-9/regex.scm create mode 100644 guile18/ice-9/runq.scm create mode 100644 guile18/ice-9/rw.scm create mode 100644 guile18/ice-9/safe-r5rs.scm create mode 100644 guile18/ice-9/safe.scm create mode 100644 guile18/ice-9/serialize.scm create mode 100644 guile18/ice-9/session.scm create mode 100644 guile18/ice-9/slib.scm create mode 100644 guile18/ice-9/stack-catch.scm create mode 100644 guile18/ice-9/streams.scm create mode 100644 guile18/ice-9/string-fun.scm create mode 100644 guile18/ice-9/syncase.scm create mode 100644 guile18/ice-9/test.scm create mode 100644 guile18/ice-9/threads.scm create mode 100644 guile18/ice-9/time.scm create mode 100644 guile18/ice-9/weak-vector.scm create mode 100644 guile18/lang/Makefile.am create mode 100644 guile18/lang/elisp/ChangeLog-2008 create mode 100644 guile18/lang/elisp/README create mode 100644 guile18/lang/elisp/STATUS create mode 100644 guile18/lang/elisp/base.scm create mode 100644 guile18/lang/elisp/example.el create mode 100644 guile18/lang/elisp/interface.scm create mode 100644 guile18/lang/elisp/internals/evaluation.scm create mode 100644 guile18/lang/elisp/internals/format.scm create mode 100644 guile18/lang/elisp/internals/fset.scm create mode 100644 guile18/lang/elisp/internals/lambda.scm create mode 100644 guile18/lang/elisp/internals/load.scm create mode 100644 guile18/lang/elisp/internals/null.scm create mode 100644 guile18/lang/elisp/internals/set.scm create mode 100644 guile18/lang/elisp/internals/signal.scm create mode 100644 guile18/lang/elisp/internals/time.scm create mode 100644 guile18/lang/elisp/internals/trace.scm create mode 100644 guile18/lang/elisp/primitives/buffers.scm create mode 100644 guile18/lang/elisp/primitives/char-table.scm create mode 100644 guile18/lang/elisp/primitives/features.scm create mode 100644 guile18/lang/elisp/primitives/fns.scm create mode 100644 guile18/lang/elisp/primitives/format.scm create mode 100644 guile18/lang/elisp/primitives/guile.scm create mode 100644 guile18/lang/elisp/primitives/keymaps.scm create mode 100644 guile18/lang/elisp/primitives/lists.scm create mode 100644 guile18/lang/elisp/primitives/load.scm create mode 100644 guile18/lang/elisp/primitives/match.scm create mode 100644 guile18/lang/elisp/primitives/numbers.scm create mode 100644 guile18/lang/elisp/primitives/pure.scm create mode 100644 guile18/lang/elisp/primitives/read.scm create mode 100644 guile18/lang/elisp/primitives/signal.scm create mode 100644 guile18/lang/elisp/primitives/strings.scm create mode 100644 guile18/lang/elisp/primitives/symprop.scm create mode 100644 guile18/lang/elisp/primitives/syntax.scm create mode 100644 guile18/lang/elisp/primitives/system.scm create mode 100644 guile18/lang/elisp/primitives/time.scm create mode 100644 guile18/lang/elisp/transform.scm create mode 100644 guile18/lang/elisp/variables.scm create mode 100644 guile18/libguile.h create mode 100644 guile18/libguile/.gitignore create mode 100644 guile18/libguile/ChangeLog-1996-1999 create mode 100644 guile18/libguile/ChangeLog-2000 create mode 100644 guile18/libguile/ChangeLog-2008 create mode 100644 guile18/libguile/ChangeLog-gh create mode 100644 guile18/libguile/ChangeLog-scm create mode 100644 guile18/libguile/ChangeLog-threads create mode 100644 guile18/libguile/Makefile.am create mode 100644 guile18/libguile/__scm.h create mode 100644 guile18/libguile/_scm.h create mode 100644 guile18/libguile/alist.c create mode 100644 guile18/libguile/alist.h create mode 100644 guile18/libguile/alloca.c create mode 100644 guile18/libguile/arbiters.c create mode 100644 guile18/libguile/arbiters.h create mode 100644 guile18/libguile/async.c create mode 100644 guile18/libguile/async.h create mode 100644 guile18/libguile/backtrace.c create mode 100644 guile18/libguile/backtrace.h create mode 100644 guile18/libguile/boolean.c create mode 100644 guile18/libguile/boolean.h create mode 100644 guile18/libguile/c-tokenize.lex create mode 100644 guile18/libguile/chars.c create mode 100644 guile18/libguile/chars.h create mode 100644 guile18/libguile/continuations.c create mode 100644 guile18/libguile/continuations.h create mode 100644 guile18/libguile/conv-integer.i.c create mode 100644 guile18/libguile/conv-uinteger.i.c create mode 100644 guile18/libguile/convert.c create mode 100644 guile18/libguile/convert.h create mode 100644 guile18/libguile/convert.i.c create mode 100644 guile18/libguile/coop-pthreads.c create mode 100644 guile18/libguile/coop-pthreads.h create mode 100644 guile18/libguile/coop.c create mode 100644 guile18/libguile/cpp_cnvt.awk create mode 100644 guile18/libguile/cpp_err_symbols.in create mode 100644 guile18/libguile/cpp_errno.c create mode 100644 guile18/libguile/cpp_sig_symbols.in create mode 100644 guile18/libguile/cpp_signal.c create mode 100644 guile18/libguile/debug-malloc.c create mode 100644 guile18/libguile/debug-malloc.h create mode 100644 guile18/libguile/debug.c create mode 100644 guile18/libguile/debug.h create mode 100644 guile18/libguile/deprecated.c create mode 100644 guile18/libguile/deprecated.h create mode 100644 guile18/libguile/deprecation.c create mode 100644 guile18/libguile/deprecation.h create mode 100644 guile18/libguile/discouraged.c create mode 100644 guile18/libguile/discouraged.h create mode 100644 guile18/libguile/dynl.c create mode 100644 guile18/libguile/dynl.h create mode 100644 guile18/libguile/dynwind.c create mode 100644 guile18/libguile/dynwind.h create mode 100644 guile18/libguile/environments.c create mode 100644 guile18/libguile/environments.h create mode 100644 guile18/libguile/eq.c create mode 100644 guile18/libguile/eq.h create mode 100644 guile18/libguile/error.c create mode 100644 guile18/libguile/error.h create mode 100644 guile18/libguile/eval.c create mode 100644 guile18/libguile/eval.h create mode 100644 guile18/libguile/evalext.c create mode 100644 guile18/libguile/evalext.h create mode 100644 guile18/libguile/extensions.c create mode 100644 guile18/libguile/extensions.h create mode 100644 guile18/libguile/feature.c create mode 100644 guile18/libguile/feature.h create mode 100644 guile18/libguile/filesys.c create mode 100644 guile18/libguile/filesys.h create mode 100644 guile18/libguile/fluids.c create mode 100644 guile18/libguile/fluids.h create mode 100644 guile18/libguile/fports.c create mode 100644 guile18/libguile/fports.h create mode 100644 guile18/libguile/futures.c create mode 100644 guile18/libguile/futures.h create mode 100644 guile18/libguile/gc-card.c create mode 100644 guile18/libguile/gc-freelist.c create mode 100644 guile18/libguile/gc-malloc.c create mode 100644 guile18/libguile/gc-mark.c create mode 100644 guile18/libguile/gc-segment.c create mode 100644 guile18/libguile/gc.c create mode 100644 guile18/libguile/gc.h create mode 100644 guile18/libguile/gc_os_dep.c create mode 100644 guile18/libguile/gdb_interface.h create mode 100644 guile18/libguile/gdbint.c create mode 100644 guile18/libguile/gdbint.h create mode 100644 guile18/libguile/gen-scmconfig.c create mode 100644 guile18/libguile/gen-scmconfig.h.in create mode 100644 guile18/libguile/gettext.h create mode 100644 guile18/libguile/gh.h create mode 100644 guile18/libguile/gh_data.c create mode 100644 guile18/libguile/gh_eval.c create mode 100644 guile18/libguile/gh_funcs.c create mode 100644 guile18/libguile/gh_init.c create mode 100644 guile18/libguile/gh_io.c create mode 100644 guile18/libguile/gh_list.c create mode 100644 guile18/libguile/gh_predicates.c create mode 100644 guile18/libguile/goops.c create mode 100644 guile18/libguile/goops.h create mode 100644 guile18/libguile/gsubr.c create mode 100644 guile18/libguile/gsubr.h create mode 100644 guile18/libguile/guardians.c create mode 100644 guile18/libguile/guardians.h create mode 100755 guile18/libguile/guile-doc-snarf.in create mode 100644 guile18/libguile/guile-func-name-check.in create mode 100755 guile18/libguile/guile-snarf-docs.in create mode 100644 guile18/libguile/guile-snarf.awk.in create mode 100644 guile18/libguile/guile-snarf.in create mode 100644 guile18/libguile/guile.c create mode 100644 guile18/libguile/hash.c create mode 100644 guile18/libguile/hash.h create mode 100644 guile18/libguile/hashtab.c create mode 100644 guile18/libguile/hashtab.h create mode 100644 guile18/libguile/hooks.c create mode 100644 guile18/libguile/hooks.h create mode 100644 guile18/libguile/i18n.c create mode 100644 guile18/libguile/i18n.h create mode 100644 guile18/libguile/inet_aton.c create mode 100644 guile18/libguile/init.c create mode 100644 guile18/libguile/init.h create mode 100644 guile18/libguile/inline.c create mode 100644 guile18/libguile/inline.h create mode 100644 guile18/libguile/ioext.c create mode 100644 guile18/libguile/ioext.h create mode 100644 guile18/libguile/iselect.h create mode 100644 guile18/libguile/keywords.c create mode 100644 guile18/libguile/keywords.h create mode 100644 guile18/libguile/lang.c create mode 100644 guile18/libguile/lang.h create mode 100644 guile18/libguile/list.c create mode 100644 guile18/libguile/list.h create mode 100644 guile18/libguile/load.c create mode 100644 guile18/libguile/load.h create mode 100644 guile18/libguile/macros.c create mode 100644 guile18/libguile/macros.h create mode 100644 guile18/libguile/mallocs.c create mode 100644 guile18/libguile/mallocs.h create mode 100644 guile18/libguile/measure-hwm.scm create mode 100644 guile18/libguile/memmove.c create mode 100644 guile18/libguile/mkstemp.c create mode 100644 guile18/libguile/modules.c create mode 100644 guile18/libguile/modules.h create mode 100644 guile18/libguile/net_db.c create mode 100644 guile18/libguile/net_db.h create mode 100644 guile18/libguile/null-threads.c create mode 100644 guile18/libguile/null-threads.h create mode 100644 guile18/libguile/numbers.c create mode 100644 guile18/libguile/numbers.h create mode 100644 guile18/libguile/objects.c create mode 100644 guile18/libguile/objects.h create mode 100644 guile18/libguile/objprop.c create mode 100644 guile18/libguile/objprop.h create mode 100644 guile18/libguile/options.c create mode 100644 guile18/libguile/options.h create mode 100644 guile18/libguile/pairs.c create mode 100644 guile18/libguile/pairs.h create mode 100644 guile18/libguile/ports.c create mode 100644 guile18/libguile/ports.h create mode 100644 guile18/libguile/posix.c create mode 100644 guile18/libguile/posix.h create mode 100644 guile18/libguile/print.c create mode 100644 guile18/libguile/print.h create mode 100644 guile18/libguile/private-gc.h create mode 100644 guile18/libguile/procprop.c create mode 100644 guile18/libguile/procprop.h create mode 100644 guile18/libguile/procs.c create mode 100644 guile18/libguile/procs.h create mode 100644 guile18/libguile/properties.c create mode 100644 guile18/libguile/properties.h create mode 100644 guile18/libguile/pthread-threads.h create mode 100644 guile18/libguile/putenv.c create mode 100644 guile18/libguile/quicksort.i.c create mode 100644 guile18/libguile/ramap.c create mode 100644 guile18/libguile/ramap.h create mode 100644 guile18/libguile/random.c create mode 100644 guile18/libguile/random.h create mode 100644 guile18/libguile/rdelim.c create mode 100644 guile18/libguile/rdelim.h create mode 100644 guile18/libguile/read.c create mode 100644 guile18/libguile/read.h create mode 100644 guile18/libguile/regex-posix.c create mode 100644 guile18/libguile/regex-posix.h create mode 100755 guile18/libguile/remaining-docs-needed create mode 100644 guile18/libguile/root.c create mode 100644 guile18/libguile/root.h create mode 100755 guile18/libguile/run-test create mode 100644 guile18/libguile/rw.c create mode 100644 guile18/libguile/rw.h create mode 100644 guile18/libguile/scmconfig.h.top create mode 100644 guile18/libguile/scmsigs.c create mode 100644 guile18/libguile/scmsigs.h create mode 100644 guile18/libguile/script.c create mode 100644 guile18/libguile/script.h create mode 100644 guile18/libguile/simpos.c create mode 100644 guile18/libguile/simpos.h create mode 100644 guile18/libguile/smob.c create mode 100644 guile18/libguile/smob.h create mode 100644 guile18/libguile/snarf.h create mode 100644 guile18/libguile/socket.c create mode 100644 guile18/libguile/socket.h create mode 100644 guile18/libguile/sort.c create mode 100644 guile18/libguile/sort.h create mode 100644 guile18/libguile/srcprop.c create mode 100644 guile18/libguile/srcprop.h create mode 100644 guile18/libguile/srfi-13.c create mode 100644 guile18/libguile/srfi-13.h create mode 100644 guile18/libguile/srfi-14.c create mode 100644 guile18/libguile/srfi-14.h create mode 100644 guile18/libguile/srfi-4.c create mode 100644 guile18/libguile/srfi-4.h create mode 100644 guile18/libguile/srfi-4.i.c create mode 100644 guile18/libguile/stackchk.c create mode 100644 guile18/libguile/stackchk.h create mode 100644 guile18/libguile/stacks.c create mode 100644 guile18/libguile/stacks.h create mode 100644 guile18/libguile/stime.c create mode 100644 guile18/libguile/stime.h create mode 100644 guile18/libguile/strerror.c create mode 100644 guile18/libguile/strings.c create mode 100644 guile18/libguile/strings.h create mode 100644 guile18/libguile/strorder.c create mode 100644 guile18/libguile/strorder.h create mode 100644 guile18/libguile/strports.c create mode 100644 guile18/libguile/strports.h create mode 100644 guile18/libguile/struct.c create mode 100644 guile18/libguile/struct.h create mode 100644 guile18/libguile/symbols.c create mode 100644 guile18/libguile/symbols.h create mode 100644 guile18/libguile/tags.h create mode 100644 guile18/libguile/threads.c create mode 100644 guile18/libguile/threads.h create mode 100644 guile18/libguile/throw.c create mode 100644 guile18/libguile/throw.h create mode 100644 guile18/libguile/unif.c create mode 100644 guile18/libguile/unif.h create mode 100644 guile18/libguile/validate.h create mode 100644 guile18/libguile/values.c create mode 100644 guile18/libguile/values.h create mode 100644 guile18/libguile/variable.c create mode 100644 guile18/libguile/variable.h create mode 100644 guile18/libguile/vectors.c create mode 100644 guile18/libguile/vectors.h create mode 100644 guile18/libguile/version.c create mode 100644 guile18/libguile/version.h.in create mode 100644 guile18/libguile/vports.c create mode 100644 guile18/libguile/vports.h create mode 100644 guile18/libguile/weaks.c create mode 100644 guile18/libguile/weaks.h create mode 100644 guile18/libguile/win32-dirent.c create mode 100644 guile18/libguile/win32-dirent.h create mode 100644 guile18/libguile/win32-socket.c create mode 100644 guile18/libguile/win32-socket.h create mode 100644 guile18/libguile/win32-uname.c create mode 100644 guile18/libguile/win32-uname.h create mode 100644 guile18/m4/.gitignore create mode 100644 guile18/m4/autobuild.m4 create mode 100644 guile18/oop/ChangeLog-2008 create mode 100644 guile18/oop/Makefile.am create mode 100644 guile18/oop/goops.scm create mode 100644 guile18/oop/goops/Makefile.am create mode 100644 guile18/oop/goops/accessors.scm create mode 100644 guile18/oop/goops/active-slot.scm create mode 100644 guile18/oop/goops/compile.scm create mode 100644 guile18/oop/goops/composite-slot.scm create mode 100644 guile18/oop/goops/describe.scm create mode 100644 guile18/oop/goops/dispatch.scm create mode 100644 guile18/oop/goops/internal.scm create mode 100644 guile18/oop/goops/old-define-method.scm create mode 100644 guile18/oop/goops/save.scm create mode 100644 guile18/oop/goops/simple.scm create mode 100644 guile18/oop/goops/stklos.scm create mode 100644 guile18/oop/goops/util.scm create mode 100644 guile18/pre-inst-guile-env.in create mode 100644 guile18/pre-inst-guile.in create mode 100644 guile18/qt/CHANGES create mode 100644 guile18/qt/ChangeLog-2008 create mode 100644 guile18/qt/Makefile.am create mode 100644 guile18/qt/Makefile.base create mode 100644 guile18/qt/README create mode 100644 guile18/qt/README.MISC create mode 100644 guile18/qt/README.PORT create mode 100644 guile18/qt/b.h create mode 100755 guile18/qt/config create mode 100644 guile18/qt/copyright.h create mode 100644 guile18/qt/libqthreads.def create mode 100644 guile18/qt/md/Makefile.am create mode 100644 guile18/qt/md/_sparc.s create mode 100644 guile18/qt/md/_sparc_b.s create mode 100644 guile18/qt/md/arm.h create mode 100644 guile18/qt/md/arm.s create mode 100644 guile18/qt/md/axp.1.Makefile create mode 100644 guile18/qt/md/axp.2.Makefile create mode 100644 guile18/qt/md/axp.Makefile create mode 100644 guile18/qt/md/axp.README create mode 100644 guile18/qt/md/axp.c create mode 100644 guile18/qt/md/axp.h create mode 100644 guile18/qt/md/axp.s create mode 100644 guile18/qt/md/axp_b.s create mode 100644 guile18/qt/md/default.Makefile create mode 100644 guile18/qt/md/hppa-cnx.Makefile create mode 100644 guile18/qt/md/hppa.Makefile create mode 100644 guile18/qt/md/hppa.h create mode 100644 guile18/qt/md/hppa.s create mode 100644 guile18/qt/md/hppa_b.s create mode 100644 guile18/qt/md/i386.README create mode 100644 guile18/qt/md/i386.asm create mode 100644 guile18/qt/md/i386.h create mode 100644 guile18/qt/md/i386.s create mode 100644 guile18/qt/md/i386_b.s create mode 100644 guile18/qt/md/ksr1.Makefile create mode 100644 guile18/qt/md/ksr1.h create mode 100644 guile18/qt/md/ksr1.s create mode 100644 guile18/qt/md/ksr1_b.s create mode 100644 guile18/qt/md/m88k.Makefile create mode 100644 guile18/qt/md/m88k.c create mode 100644 guile18/qt/md/m88k.h create mode 100644 guile18/qt/md/m88k.s create mode 100644 guile18/qt/md/m88k_b.s create mode 100644 guile18/qt/md/mips-irix5.s create mode 100644 guile18/qt/md/mips.h create mode 100644 guile18/qt/md/mips.s create mode 100644 guile18/qt/md/mips_b.s create mode 100644 guile18/qt/md/null.README create mode 100644 guile18/qt/md/null.c create mode 100644 guile18/qt/md/solaris.README create mode 100644 guile18/qt/md/sparc.h create mode 100644 guile18/qt/md/sparc.s create mode 100644 guile18/qt/md/sparc_b.s create mode 100644 guile18/qt/md/vax.h create mode 100644 guile18/qt/md/vax.s create mode 100644 guile18/qt/md/vax_b.s create mode 100644 guile18/qt/meas.c create mode 100644 guile18/qt/qt.c create mode 100644 guile18/qt/qt.h.in create mode 100644 guile18/qt/stp.c create mode 100644 guile18/qt/stp.h create mode 100644 guile18/qt/time/Makefile.am create mode 100644 guile18/qt/time/README.time create mode 100755 guile18/qt/time/assim create mode 100755 guile18/qt/time/cswap create mode 100755 guile18/qt/time/go create mode 100755 guile18/qt/time/init create mode 100755 guile18/qt/time/prim create mode 100755 guile18/qt/time/raw create mode 100644 guile18/scripts/ChangeLog-2008 create mode 100644 guile18/scripts/Makefile.am create mode 100755 guile18/scripts/PROGRAM create mode 100644 guile18/scripts/README create mode 100755 guile18/scripts/api-diff create mode 100755 guile18/scripts/autofrisk create mode 100755 guile18/scripts/display-commentary create mode 100755 guile18/scripts/doc-snarf create mode 100755 guile18/scripts/frisk create mode 100755 guile18/scripts/generate-autoload create mode 100755 guile18/scripts/lint create mode 100755 guile18/scripts/punify create mode 100755 guile18/scripts/read-rfc822 create mode 100755 guile18/scripts/read-scheme-source create mode 100755 guile18/scripts/read-text-outline create mode 100755 guile18/scripts/scan-api create mode 100755 guile18/scripts/snarf-check-and-output-texi create mode 100755 guile18/scripts/snarf-guile-m4-docs create mode 100755 guile18/scripts/summarize-guile-TODO create mode 100755 guile18/scripts/use2dot create mode 100644 guile18/srfi/ChangeLog-2008 create mode 100644 guile18/srfi/Makefile.am create mode 100644 guile18/srfi/README create mode 100644 guile18/srfi/srfi-1.c create mode 100644 guile18/srfi/srfi-1.h create mode 100644 guile18/srfi/srfi-1.scm create mode 100644 guile18/srfi/srfi-10.scm create mode 100644 guile18/srfi/srfi-11.scm create mode 100644 guile18/srfi/srfi-13.c create mode 100644 guile18/srfi/srfi-13.h create mode 100644 guile18/srfi/srfi-13.scm create mode 100644 guile18/srfi/srfi-14.c create mode 100644 guile18/srfi/srfi-14.h create mode 100644 guile18/srfi/srfi-14.scm create mode 100644 guile18/srfi/srfi-16.scm create mode 100644 guile18/srfi/srfi-17.scm create mode 100644 guile18/srfi/srfi-19.scm create mode 100644 guile18/srfi/srfi-2.scm create mode 100644 guile18/srfi/srfi-26.scm create mode 100644 guile18/srfi/srfi-31.scm create mode 100644 guile18/srfi/srfi-34.scm create mode 100644 guile18/srfi/srfi-35.scm create mode 100644 guile18/srfi/srfi-37.scm create mode 100644 guile18/srfi/srfi-39.scm create mode 100644 guile18/srfi/srfi-4.c create mode 100644 guile18/srfi/srfi-4.h create mode 100644 guile18/srfi/srfi-4.scm create mode 100644 guile18/srfi/srfi-6.scm create mode 100644 guile18/srfi/srfi-60.c create mode 100644 guile18/srfi/srfi-60.h create mode 100644 guile18/srfi/srfi-60.scm create mode 100644 guile18/srfi/srfi-69.scm create mode 100644 guile18/srfi/srfi-8.scm create mode 100644 guile18/srfi/srfi-88.scm create mode 100644 guile18/srfi/srfi-9.scm create mode 100644 guile18/test-suite/ChangeLog-2008 create mode 100644 guile18/test-suite/Makefile.am create mode 100644 guile18/test-suite/README create mode 100755 guile18/test-suite/guile-test create mode 100644 guile18/test-suite/lib.scm create mode 100644 guile18/test-suite/standalone/.gitignore create mode 100644 guile18/test-suite/standalone/Makefile.am create mode 100644 guile18/test-suite/standalone/README create mode 100755 guile18/test-suite/standalone/test-asmobs create mode 100644 guile18/test-suite/standalone/test-asmobs-lib.c create mode 100755 guile18/test-suite/standalone/test-bad-identifiers create mode 100644 guile18/test-suite/standalone/test-conversion.c create mode 100644 guile18/test-suite/standalone/test-fast-slot-ref.in create mode 100644 guile18/test-suite/standalone/test-gh.c create mode 100644 guile18/test-suite/standalone/test-list.c create mode 100644 guile18/test-suite/standalone/test-num2integral.c create mode 100755 guile18/test-suite/standalone/test-require-extension create mode 100644 guile18/test-suite/standalone/test-round.c create mode 100644 guile18/test-suite/standalone/test-scm-c-read.c create mode 100644 guile18/test-suite/standalone/test-scm-take-locale-symbol.c create mode 100644 guile18/test-suite/standalone/test-scm-with-guile.c create mode 100755 guile18/test-suite/standalone/test-system-cmds create mode 100644 guile18/test-suite/standalone/test-unwind.c create mode 100755 guile18/test-suite/standalone/test-use-srfi.in create mode 100644 guile18/test-suite/standalone/test-with-guile-module.c create mode 100644 guile18/test-suite/tests/alist.test create mode 100644 guile18/test-suite/tests/and-let-star.test create mode 100644 guile18/test-suite/tests/arbiters.test create mode 100644 guile18/test-suite/tests/bit-operations.test create mode 100644 guile18/test-suite/tests/c-api.test create mode 100644 guile18/test-suite/tests/c-api/Makefile create mode 100644 guile18/test-suite/tests/c-api/README create mode 100644 guile18/test-suite/tests/c-api/strings.c create mode 100644 guile18/test-suite/tests/c-api/testlib.c create mode 100644 guile18/test-suite/tests/c-api/testlib.h create mode 100644 guile18/test-suite/tests/chars.test create mode 100644 guile18/test-suite/tests/common-list.test create mode 100644 guile18/test-suite/tests/continuations.test create mode 100644 guile18/test-suite/tests/dynamic-scope.test create mode 100644 guile18/test-suite/tests/elisp.test create mode 100644 guile18/test-suite/tests/environments.test create mode 100644 guile18/test-suite/tests/eval.test create mode 100644 guile18/test-suite/tests/exceptions.test create mode 100644 guile18/test-suite/tests/filesys.test create mode 100644 guile18/test-suite/tests/format.test create mode 100644 guile18/test-suite/tests/fractions.test create mode 100644 guile18/test-suite/tests/ftw.test create mode 100644 guile18/test-suite/tests/gc.test create mode 100644 guile18/test-suite/tests/getopt-long.test create mode 100644 guile18/test-suite/tests/goops.test create mode 100644 guile18/test-suite/tests/guardians.test create mode 100644 guile18/test-suite/tests/hash.test create mode 100644 guile18/test-suite/tests/hooks.test create mode 100644 guile18/test-suite/tests/import.test create mode 100644 guile18/test-suite/tests/interp.test create mode 100644 guile18/test-suite/tests/list.test create mode 100644 guile18/test-suite/tests/load.test create mode 100644 guile18/test-suite/tests/modules.test create mode 100644 guile18/test-suite/tests/multilingual.nottest create mode 100644 guile18/test-suite/tests/numbers.test create mode 100644 guile18/test-suite/tests/optargs.test create mode 100644 guile18/test-suite/tests/options.test create mode 100644 guile18/test-suite/tests/pairs.test create mode 100644 guile18/test-suite/tests/poe.test create mode 100644 guile18/test-suite/tests/popen.test create mode 100644 guile18/test-suite/tests/ports.test create mode 100644 guile18/test-suite/tests/posix.test create mode 100644 guile18/test-suite/tests/procprop.test create mode 100644 guile18/test-suite/tests/q.test create mode 100644 guile18/test-suite/tests/r4rs.test create mode 100644 guile18/test-suite/tests/r5rs_pitfall.test create mode 100644 guile18/test-suite/tests/ramap.test create mode 100644 guile18/test-suite/tests/reader.test create mode 100644 guile18/test-suite/tests/receive.test create mode 100644 guile18/test-suite/tests/regexp.test create mode 100644 guile18/test-suite/tests/signals.test create mode 100644 guile18/test-suite/tests/socket.test create mode 100644 guile18/test-suite/tests/sort.test create mode 100644 guile18/test-suite/tests/srcprop.test create mode 100644 guile18/test-suite/tests/srfi-1.test create mode 100644 guile18/test-suite/tests/srfi-10.test create mode 100644 guile18/test-suite/tests/srfi-11.test create mode 100644 guile18/test-suite/tests/srfi-13.test create mode 100644 guile18/test-suite/tests/srfi-14.test create mode 100644 guile18/test-suite/tests/srfi-17.test create mode 100644 guile18/test-suite/tests/srfi-19.test create mode 100644 guile18/test-suite/tests/srfi-26.test create mode 100644 guile18/test-suite/tests/srfi-31.test create mode 100644 guile18/test-suite/tests/srfi-34.test create mode 100644 guile18/test-suite/tests/srfi-35.test create mode 100644 guile18/test-suite/tests/srfi-37.test create mode 100644 guile18/test-suite/tests/srfi-39.test create mode 100644 guile18/test-suite/tests/srfi-4.test create mode 100644 guile18/test-suite/tests/srfi-6.test create mode 100644 guile18/test-suite/tests/srfi-60.test create mode 100644 guile18/test-suite/tests/srfi-69.test create mode 100644 guile18/test-suite/tests/srfi-88.test create mode 100644 guile18/test-suite/tests/srfi-9.test create mode 100644 guile18/test-suite/tests/streams.test create mode 100644 guile18/test-suite/tests/strings.test create mode 100644 guile18/test-suite/tests/structs.test create mode 100644 guile18/test-suite/tests/symbols.test create mode 100644 guile18/test-suite/tests/syncase.test create mode 100644 guile18/test-suite/tests/syntax.test create mode 100644 guile18/test-suite/tests/threads.test create mode 100644 guile18/test-suite/tests/time.test create mode 100644 guile18/test-suite/tests/unif.test create mode 100644 guile18/test-suite/tests/version.test create mode 100644 guile18/test-suite/tests/weaks.test diff --git a/guile18/.gitignore b/guile18/.gitignore new file mode 100644 index 0000000000..7644deacdb --- /dev/null +++ b/guile18/.gitignore @@ -0,0 +1,77 @@ +*.o +*.info +*.info-[0-9]* +version.texi +Makefile +Makefile.in +.deps +.libs +autom4te.cache +config.sub +config.guess +config.status +config.log +config.h +guile-readline-config.h +*.doc +*.x +*.lo +*.la +aclocal.m4 +libtool +ltmain.sh +configure +depcomp +elisp-comp +missing +mdate-sh +install-sh +texinfo.tex +*~ +,* +BUGS +Makefile +Makefile.in +aclocal.m4 +autom4te.cache +benchmark-guile +check-guile +check-guile.log +compile +confdefs.h +config.build-subdirs +config.cache +config.guess +config.h +config.h.in +config.log +config.status +config.sub +configure +conftest +conftest.c +depcomp +elisp-comp +guile-*.tar.gz +guile-tools +install-sh +libtool +ltconfig +ltmain.sh +mdate-sh +missing +mkinstalldirs +pre-inst-guile +pre-inst-guile-env +stamp-h1 +guile-procedures.txt +guile-config/guile-config +guile-readline/guile-readline-config.h +guile-readline/guile-readline-config.h.in +TAGS +guile-1.8.pc +libguile/stack-limit-calibration.scm +cscope.out +cscope.files +*.log +INSTALL diff --git a/guile18/ABOUT-NLS b/guile18/ABOUT-NLS new file mode 100644 index 0000000000..ec20977e06 --- /dev/null +++ b/guile18/ABOUT-NLS @@ -0,0 +1,1101 @@ +1 Notes on the Free Translation Project +*************************************** + +Free software is going international! The Free Translation Project is +a way to get maintainers of free software, translators, and users all +together, so that free software will gradually become able to speak many +languages. A few packages already provide translations for their +messages. + + If you found this `ABOUT-NLS' file inside a distribution, you may +assume that the distributed package does use GNU `gettext' internally, +itself available at your nearest GNU archive site. But you do _not_ +need to install GNU `gettext' prior to configuring, installing or using +this package with messages translated. + + Installers will find here some useful hints. These notes also +explain how users should proceed for getting the programs to use the +available translations. They tell how people wanting to contribute and +work on translations can contact the appropriate team. + + When reporting bugs in the `intl/' directory or bugs which may be +related to internationalization, you should tell about the version of +`gettext' which is used. The information can be found in the +`intl/VERSION' file, in internationalized packages. + +1.1 Quick configuration advice +============================== + +If you want to exploit the full power of internationalization, you +should configure it using + + ./configure --with-included-gettext + +to force usage of internationalizing routines provided within this +package, despite the existence of internationalizing capabilities in the +operating system where this package is being installed. So far, only +the `gettext' implementation in the GNU C library version 2 provides as +many features (such as locale alias, message inheritance, automatic +charset conversion or plural form handling) as the implementation here. +It is also not possible to offer this additional functionality on top +of a `catgets' implementation. Future versions of GNU `gettext' will +very likely convey even more functionality. So it might be a good idea +to change to GNU `gettext' as soon as possible. + + So you need _not_ provide this option if you are using GNU libc 2 or +you have installed a recent copy of the GNU gettext package with the +included `libintl'. + +1.2 INSTALL Matters +=================== + +Some packages are "localizable" when properly installed; the programs +they contain can be made to speak your own native language. Most such +packages use GNU `gettext'. Other packages have their own ways to +internationalization, predating GNU `gettext'. + + By default, this package will be installed to allow translation of +messages. It will automatically detect whether the system already +provides the GNU `gettext' functions. If not, the included GNU +`gettext' library will be used. This library is wholly contained +within this package, usually in the `intl/' subdirectory, so prior +installation of the GNU `gettext' package is _not_ required. +Installers may use special options at configuration time for changing +the default behaviour. The commands: + + ./configure --with-included-gettext + ./configure --disable-nls + +will, respectively, bypass any pre-existing `gettext' to use the +internationalizing routines provided within this package, or else, +_totally_ disable translation of messages. + + When you already have GNU `gettext' installed on your system and run +configure without an option for your new package, `configure' will +probably detect the previously built and installed `libintl.a' file and +will decide to use this. This might not be desirable. You should use +the more recent version of the GNU `gettext' library. I.e. if the file +`intl/VERSION' shows that the library which comes with this package is +more recent, you should use + + ./configure --with-included-gettext + +to prevent auto-detection. + + The configuration process will not test for the `catgets' function +and therefore it will not be used. The reason is that even an +emulation of `gettext' on top of `catgets' could not provide all the +extensions of the GNU `gettext' library. + + Internationalized packages usually have many `po/LL.po' files, where +LL gives an ISO 639 two-letter code identifying the language. Unless +translations have been forbidden at `configure' time by using the +`--disable-nls' switch, all available translations are installed +together with the package. However, the environment variable `LINGUAS' +may be set, prior to configuration, to limit the installed set. +`LINGUAS' should then contain a space separated list of two-letter +codes, stating which languages are allowed. + +1.3 Using This Package +====================== + +As a user, if your language has been installed for this package, you +only have to set the `LANG' environment variable to the appropriate +`LL_CC' combination. Here `LL' is an ISO 639 two-letter language code, +and `CC' is an ISO 3166 two-letter country code. For example, let's +suppose that you speak German and live in Germany. At the shell +prompt, merely execute `setenv LANG de_DE' (in `csh'), +`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). +This can be done from your `.login' or `.profile' file, once and for +all. + + You might think that the country code specification is redundant. +But in fact, some languages have dialects in different countries. For +example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The +country code serves to distinguish the dialects. + + The locale naming convention of `LL_CC', with `LL' denoting the +language and `CC' denoting the country, is the one use on systems based +on GNU libc. On other systems, some variations of this scheme are +used, such as `LL' or `LL_CC.ENCODING'. You can get the list of +locales supported by your system for your language by running the +command `locale -a | grep '^LL''. + + Not all programs have translations for all languages. By default, an +English message is shown in place of a nonexistent translation. If you +understand other languages, you can set up a priority list of languages. +This is done through a different environment variable, called +`LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' +for the purpose of message handling, but you still need to have `LANG' +set to the primary language; this is required by other parts of the +system libraries. For example, some Swedish users who would rather +read translations in German than English for when Swedish is not +available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. + + Special advice for Norwegian users: The language code for Norwegian +bokma*l changed from `no' to `nb' recently (in 2003). During the +transition period, while some message catalogs for this language are +installed under `nb' and some older ones under `no', it's recommended +for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and +older translations are used. + + In the `LANGUAGE' environment variable, but not in the `LANG' +environment variable, `LL_CC' combinations can be abbreviated as `LL' +to denote the language's main dialect. For example, `de' is equivalent +to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' +(Portuguese as spoken in Portugal) in this context. + +1.4 Translating Teams +===================== + +For the Free Translation Project to be a success, we need interested +people who like their own language and write it well, and who are also +able to synergize with other translators speaking the same language. +Each translation team has its own mailing list. The up-to-date list of +teams can be found at the Free Translation Project's homepage, +`http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams" +area. + + If you'd like to volunteer to _work_ at translating messages, you +should become a member of the translating team for your own language. +The subscribing address is _not_ the same as the list itself, it has +`-request' appended. For example, speakers of Swedish can send a +message to `sv-request@li.org', having this message body: + + subscribe + + Keep in mind that team members are expected to participate +_actively_ in translations, or at solving translational difficulties, +rather than merely lurking around. If your team does not exist yet and +you want to start one, or if you are unsure about what to do or how to +get started, please write to `translation@iro.umontreal.ca' to reach the +coordinator for all translator teams. + + The English team is special. It works at improving and uniformizing +the terminology in use. Proven linguistic skills are praised more than +programming skills, here. + +1.5 Available Packages +====================== + +Languages are not equally supported in all packages. The following +matrix shows the current state of internationalization, as of October +2006. The matrix shows, in regard of each package, for which languages +PO files have been submitted to translation coordination, with a +translation percentage of at least 50%. + + Ready PO files af am ar az be bg bs ca cs cy da de el en en_GB eo + +----------------------------------------------------+ + GNUnet | [] | + a2ps | [] [] [] [] [] | + aegis | () | + ant-phone | () | + anubis | [] | + ap-utils | | + aspell | [] [] [] [] [] | + bash | [] [] [] | + batchelor | [] | + bfd | | + bibshelf | [] | + binutils | [] | + bison | [] [] | + bison-runtime | | + bluez-pin | [] [] [] [] [] | + cflow | [] | + clisp | [] [] | + console-tools | [] [] | + coreutils | [] [] [] | + cpio | | + cpplib | [] [] [] | + cryptonit | [] | + darkstat | [] () [] | + dialog | [] [] [] [] [] [] | + diffutils | [] [] [] [] [] [] | + doodle | [] | + e2fsprogs | [] [] | + enscript | [] [] [] [] | + error | [] [] [] [] | + fetchmail | [] [] () [] | + fileutils | [] [] | + findutils | [] [] [] | + flex | [] [] [] | + fslint | [] | + gas | | + gawk | [] [] [] | + gbiff | [] | + gcal | [] | + gcc | [] | + gettext-examples | [] [] [] [] [] | + gettext-runtime | [] [] [] [] [] | + gettext-tools | [] [] | + gimp-print | [] [] [] [] | + gip | [] | + gliv | [] | + glunarclock | [] | + gmult | [] [] | + gnubiff | () | + gnucash | () () [] | + gnucash-glossary | [] () | + gnuedu | | + gnulib | [] [] [] [] [] [] | + gnunet-gtk | | + gnutls | | + gpe-aerial | [] [] | + gpe-beam | [] [] | + gpe-calendar | | + gpe-clock | [] [] | + gpe-conf | [] [] | + gpe-contacts | | + gpe-edit | [] | + gpe-filemanager | | + gpe-go | [] | + gpe-login | [] [] | + gpe-ownerinfo | [] [] | + gpe-package | | + gpe-sketchbook | [] [] | + gpe-su | [] [] | + gpe-taskmanager | [] [] | + gpe-timesheet | [] | + gpe-today | [] [] | + gpe-todo | | + gphoto2 | [] [] [] [] | + gprof | [] [] | + gpsdrive | () () | + gramadoir | [] [] | + grep | [] [] [] [] [] [] | + gretl | | + gsasl | | + gss | | + gst-plugins | [] [] [] [] | + gst-plugins-base | [] [] [] | + gst-plugins-good | [] [] [] [] [] [] [] | + gstreamer | [] [] [] [] [] [] [] | + gtick | () | + gtkam | [] [] [] | + gtkorphan | [] [] | + gtkspell | [] [] [] [] | + gutenprint | [] | + hello | [] [] [] [] [] | + id-utils | [] [] | + impost | | + indent | [] [] [] | + iso_3166 | [] [] | + iso_3166_2 | | + iso_4217 | [] | + iso_639 | [] [] | + jpilot | [] | + jtag | | + jwhois | | + kbd | [] [] [] [] | + keytouch | | + keytouch-editor | | + keytouch-keyboa... | | + latrine | () | + ld | [] | + leafpad | [] [] [] [] [] | + libc | [] [] [] [] [] | + libexif | [] | + libextractor | [] | + libgpewidget | [] [] [] | + libgpg-error | [] | + libgphoto2 | [] [] | + libgphoto2_port | [] [] | + libgsasl | | + libiconv | [] [] | + libidn | [] [] | + lifelines | [] () | + lilypond | [] | + lingoteach | | + lynx | [] [] [] [] | + m4 | [] [] [] [] | + mailutils | [] | + make | [] [] | + man-db | [] () [] [] | + minicom | [] [] [] | + mysecretdiary | [] [] | + nano | [] [] [] | + nano_1_0 | [] () [] [] | + opcodes | [] | + parted | | + pilot-qof | [] | + psmisc | [] | + pwdutils | | + python | | + qof | | + radius | [] | + recode | [] [] [] [] [] [] | + rpm | [] [] | + screem | | + scrollkeeper | [] [] [] [] [] [] [] [] | + sed | [] [] [] | + sh-utils | [] [] | + shared-mime-info | [] [] [] [] | + sharutils | [] [] [] [] [] [] | + shishi | | + silky | | + skencil | [] () | + sketch | [] () | + solfege | | + soundtracker | [] [] | + sp | [] | + stardict | [] | + system-tools-ba... | [] [] [] [] [] [] [] [] [] | + tar | [] | + texinfo | [] [] [] | + textutils | [] [] [] | + tin | () () | + tp-robot | [] | + tuxpaint | [] [] [] [] [] | + unicode-han-tra... | | + unicode-transla... | | + util-linux | [] [] [] [] | + vorbis-tools | [] [] [] [] | + wastesedge | () | + wdiff | [] [] [] [] | + wget | [] [] | + xchat | [] [] [] [] [] [] | + xkeyboard-config | | + xpad | [] [] | + +----------------------------------------------------+ + af am ar az be bg bs ca cs cy da de el en en_GB eo + 10 0 1 2 9 22 1 42 41 2 60 95 16 1 17 16 + + es et eu fa fi fr ga gl gu he hi hr hu id is it + +--------------------------------------------------+ + GNUnet | | + a2ps | [] [] [] () | + aegis | | + ant-phone | [] | + anubis | [] | + ap-utils | [] [] | + aspell | [] [] [] | + bash | [] [] [] | + batchelor | [] [] | + bfd | [] | + bibshelf | [] [] [] | + binutils | [] [] [] | + bison | [] [] [] [] [] [] | + bison-runtime | [] [] [] [] [] | + bluez-pin | [] [] [] [] [] | + cflow | [] | + clisp | [] [] | + console-tools | | + coreutils | [] [] [] [] [] [] | + cpio | [] [] [] | + cpplib | [] [] | + cryptonit | [] | + darkstat | [] () [] [] [] | + dialog | [] [] [] [] [] [] [] [] | + diffutils | [] [] [] [] [] [] [] [] [] | + doodle | [] [] | + e2fsprogs | [] [] [] | + enscript | [] [] [] | + error | [] [] [] [] [] | + fetchmail | [] | + fileutils | [] [] [] [] [] [] | + findutils | [] [] [] [] | + flex | [] [] [] | + fslint | [] | + gas | [] [] | + gawk | [] [] [] [] | + gbiff | [] | + gcal | [] [] | + gcc | [] | + gettext-examples | [] [] [] [] [] [] | + gettext-runtime | [] [] [] [] [] [] | + gettext-tools | [] [] [] | + gimp-print | [] [] | + gip | [] [] [] | + gliv | () | + glunarclock | [] [] [] | + gmult | [] [] [] | + gnubiff | () () | + gnucash | () () () | + gnucash-glossary | [] [] | + gnuedu | [] | + gnulib | [] [] [] [] [] [] [] [] | + gnunet-gtk | | + gnutls | | + gpe-aerial | [] [] | + gpe-beam | [] [] | + gpe-calendar | | + gpe-clock | [] [] [] [] | + gpe-conf | [] | + gpe-contacts | [] [] | + gpe-edit | [] [] [] [] | + gpe-filemanager | [] | + gpe-go | [] [] [] | + gpe-login | [] [] [] | + gpe-ownerinfo | [] [] [] [] [] | + gpe-package | [] | + gpe-sketchbook | [] [] | + gpe-su | [] [] [] [] | + gpe-taskmanager | [] [] [] | + gpe-timesheet | [] [] [] [] | + gpe-today | [] [] [] [] | + gpe-todo | [] | + gphoto2 | [] [] [] [] [] | + gprof | [] [] [] [] | + gpsdrive | () () [] () | + gramadoir | [] [] | + grep | [] [] [] [] [] [] [] [] [] [] [] [] | + gretl | [] [] [] | + gsasl | [] [] | + gss | [] | + gst-plugins | [] [] [] | + gst-plugins-base | [] [] | + gst-plugins-good | [] [] [] | + gstreamer | [] [] [] | + gtick | [] | + gtkam | [] [] [] [] | + gtkorphan | [] [] | + gtkspell | [] [] [] [] [] [] | + gutenprint | [] | + hello | [] [] [] [] [] [] [] [] [] [] [] [] [] | + id-utils | [] [] [] [] [] | + impost | [] [] | + indent | [] [] [] [] [] [] [] [] [] [] | + iso_3166 | [] [] [] | + iso_3166_2 | [] | + iso_4217 | [] [] [] [] | + iso_639 | [] [] [] [] [] | + jpilot | [] [] | + jtag | [] | + jwhois | [] [] [] [] [] | + kbd | [] [] | + keytouch | [] | + keytouch-editor | [] | + keytouch-keyboa... | [] | + latrine | [] [] [] | + ld | [] [] | + leafpad | [] [] [] [] [] [] | + libc | [] [] [] [] [] | + libexif | [] | + libextractor | [] | + libgpewidget | [] [] [] [] [] | + libgpg-error | | + libgphoto2 | [] [] [] | + libgphoto2_port | [] [] | + libgsasl | [] [] | + libiconv | [] [] | + libidn | [] [] | + lifelines | () | + lilypond | [] | + lingoteach | [] [] [] | + lynx | [] [] [] | + m4 | [] [] [] [] | + mailutils | [] [] | + make | [] [] [] [] [] [] [] [] | + man-db | () | + minicom | [] [] [] [] | + mysecretdiary | [] [] [] | + nano | [] [] [] [] [] [] | + nano_1_0 | [] [] [] [] [] | + opcodes | [] [] [] [] | + parted | [] [] [] [] | + pilot-qof | | + psmisc | [] [] [] | + pwdutils | | + python | | + qof | [] | + radius | [] [] | + recode | [] [] [] [] [] [] [] [] | + rpm | [] [] | + screem | | + scrollkeeper | [] [] [] | + sed | [] [] [] [] [] | + sh-utils | [] [] [] [] [] [] [] | + shared-mime-info | [] [] [] [] [] [] | + sharutils | [] [] [] [] [] [] [] [] | + shishi | | + silky | [] | + skencil | [] [] | + sketch | [] [] | + solfege | [] | + soundtracker | [] [] [] | + sp | [] | + stardict | [] | + system-tools-ba... | [] [] [] [] [] [] [] [] | + tar | [] [] [] [] [] [] [] | + texinfo | [] [] | + textutils | [] [] [] [] [] | + tin | [] () | + tp-robot | [] [] [] [] | + tuxpaint | [] [] | + unicode-han-tra... | | + unicode-transla... | [] [] | + util-linux | [] [] [] [] [] [] [] | + vorbis-tools | [] [] | + wastesedge | () | + wdiff | [] [] [] [] [] [] [] [] | + wget | [] [] [] [] [] [] [] [] | + xchat | [] [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] [] | + xpad | [] [] [] | + +--------------------------------------------------+ + es et eu fa fi fr ga gl gu he hi hr hu id is it + 88 22 14 2 40 115 61 14 1 8 1 6 59 31 0 52 + + ja ko ku ky lg lt lv mk mn ms mt nb ne nl nn no + +-------------------------------------------------+ + GNUnet | | + a2ps | () [] [] () | + aegis | () | + ant-phone | [] | + anubis | [] [] [] | + ap-utils | [] | + aspell | [] [] | + bash | [] | + batchelor | [] [] | + bfd | | + bibshelf | [] | + binutils | | + bison | [] [] [] | + bison-runtime | [] [] [] | + bluez-pin | [] [] [] | + cflow | | + clisp | [] | + console-tools | | + coreutils | [] | + cpio | | + cpplib | [] | + cryptonit | [] | + darkstat | [] [] | + dialog | [] [] | + diffutils | [] [] [] | + doodle | | + e2fsprogs | [] | + enscript | [] | + error | [] | + fetchmail | [] [] | + fileutils | [] [] | + findutils | [] | + flex | [] [] | + fslint | [] [] | + gas | | + gawk | [] [] | + gbiff | [] | + gcal | | + gcc | | + gettext-examples | [] [] | + gettext-runtime | [] [] [] | + gettext-tools | [] [] | + gimp-print | [] [] | + gip | [] [] | + gliv | [] | + glunarclock | [] [] | + gmult | [] [] | + gnubiff | | + gnucash | () () | + gnucash-glossary | [] | + gnuedu | | + gnulib | [] [] [] [] | + gnunet-gtk | | + gnutls | | + gpe-aerial | [] | + gpe-beam | [] | + gpe-calendar | [] | + gpe-clock | [] [] [] | + gpe-conf | [] [] | + gpe-contacts | [] | + gpe-edit | [] [] [] | + gpe-filemanager | [] [] | + gpe-go | [] [] [] | + gpe-login | [] [] [] | + gpe-ownerinfo | [] [] | + gpe-package | [] [] | + gpe-sketchbook | [] [] | + gpe-su | [] [] [] | + gpe-taskmanager | [] [] [] [] | + gpe-timesheet | [] | + gpe-today | [] [] | + gpe-todo | [] | + gphoto2 | [] [] | + gprof | | + gpsdrive | () () () | + gramadoir | () | + grep | [] [] [] [] | + gretl | | + gsasl | [] | + gss | | + gst-plugins | [] | + gst-plugins-base | | + gst-plugins-good | [] | + gstreamer | [] | + gtick | | + gtkam | [] | + gtkorphan | [] | + gtkspell | [] [] | + gutenprint | | + hello | [] [] [] [] [] [] | + id-utils | [] | + impost | | + indent | [] [] | + iso_3166 | [] | + iso_3166_2 | [] | + iso_4217 | [] [] [] | + iso_639 | [] [] | + jpilot | () () () | + jtag | | + jwhois | [] | + kbd | [] | + keytouch | [] | + keytouch-editor | | + keytouch-keyboa... | | + latrine | [] | + ld | | + leafpad | [] [] | + libc | [] [] [] [] [] | + libexif | | + libextractor | | + libgpewidget | [] | + libgpg-error | | + libgphoto2 | [] | + libgphoto2_port | [] | + libgsasl | [] | + libiconv | | + libidn | [] [] | + lifelines | [] | + lilypond | | + lingoteach | [] | + lynx | [] [] | + m4 | [] [] | + mailutils | | + make | [] [] [] | + man-db | () | + minicom | [] | + mysecretdiary | [] | + nano | [] [] [] | + nano_1_0 | [] [] [] | + opcodes | [] | + parted | [] [] | + pilot-qof | | + psmisc | [] [] [] | + pwdutils | | + python | | + qof | | + radius | | + recode | [] | + rpm | [] [] | + screem | [] | + scrollkeeper | [] [] [] [] | + sed | [] [] | + sh-utils | [] [] | + shared-mime-info | [] [] [] [] [] | + sharutils | [] [] | + shishi | | + silky | [] | + skencil | | + sketch | | + solfege | | + soundtracker | | + sp | () | + stardict | [] [] | + system-tools-ba... | [] [] [] [] | + tar | [] [] [] | + texinfo | [] [] [] | + textutils | [] [] [] | + tin | | + tp-robot | [] | + tuxpaint | [] | + unicode-han-tra... | | + unicode-transla... | | + util-linux | [] [] | + vorbis-tools | [] | + wastesedge | [] | + wdiff | [] [] | + wget | [] [] | + xchat | [] [] [] [] | + xkeyboard-config | [] | + xpad | [] [] [] | + +-------------------------------------------------+ + ja ko ku ky lg lt lv mk mn ms mt nb ne nl nn no + 52 24 2 2 1 3 0 2 3 21 0 15 1 97 5 1 + + nso or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta + +------------------------------------------------------+ + GNUnet | | + a2ps | () [] [] [] [] [] [] | + aegis | () () | + ant-phone | [] [] | + anubis | [] [] [] | + ap-utils | () | + aspell | [] [] | + bash | [] [] [] | + batchelor | [] [] | + bfd | | + bibshelf | [] | + binutils | [] [] | + bison | [] [] [] [] [] | + bison-runtime | [] [] [] [] | + bluez-pin | [] [] [] [] [] [] [] [] [] | + cflow | [] | + clisp | [] | + console-tools | [] | + coreutils | [] [] [] [] | + cpio | [] [] [] | + cpplib | [] | + cryptonit | [] [] | + darkstat | [] [] [] [] [] [] | + dialog | [] [] [] [] [] [] [] [] [] | + diffutils | [] [] [] [] [] [] | + doodle | [] [] | + e2fsprogs | [] [] | + enscript | [] [] [] [] [] | + error | [] [] [] [] | + fetchmail | [] [] [] | + fileutils | [] [] [] [] [] | + findutils | [] [] [] [] [] [] | + flex | [] [] [] [] [] | + fslint | [] [] [] [] | + gas | | + gawk | [] [] [] [] | + gbiff | [] | + gcal | [] | + gcc | [] | + gettext-examples | [] [] [] [] [] [] [] [] | + gettext-runtime | [] [] [] [] [] [] [] [] | + gettext-tools | [] [] [] [] [] [] [] | + gimp-print | [] [] | + gip | [] [] [] [] | + gliv | [] [] [] [] | + glunarclock | [] [] [] [] [] [] | + gmult | [] [] [] [] | + gnubiff | () | + gnucash | () [] | + gnucash-glossary | [] [] [] | + gnuedu | | + gnulib | [] [] [] [] [] | + gnunet-gtk | [] | + gnutls | [] [] | + gpe-aerial | [] [] [] [] [] [] [] | + gpe-beam | [] [] [] [] [] [] [] | + gpe-calendar | [] | + gpe-clock | [] [] [] [] [] [] [] [] | + gpe-conf | [] [] [] [] [] [] [] | + gpe-contacts | [] [] [] [] [] | + gpe-edit | [] [] [] [] [] [] [] [] | + gpe-filemanager | [] [] | + gpe-go | [] [] [] [] [] [] | + gpe-login | [] [] [] [] [] [] [] [] | + gpe-ownerinfo | [] [] [] [] [] [] [] [] | + gpe-package | [] [] | + gpe-sketchbook | [] [] [] [] [] [] [] [] | + gpe-su | [] [] [] [] [] [] [] [] | + gpe-taskmanager | [] [] [] [] [] [] [] [] | + gpe-timesheet | [] [] [] [] [] [] [] [] | + gpe-today | [] [] [] [] [] [] [] [] | + gpe-todo | [] [] [] [] | + gphoto2 | [] [] [] [] [] | + gprof | [] [] [] | + gpsdrive | [] [] [] | + gramadoir | [] [] | + grep | [] [] [] [] [] [] [] [] | + gretl | [] | + gsasl | [] [] [] | + gss | [] [] [] | + gst-plugins | [] [] [] [] | + gst-plugins-base | [] | + gst-plugins-good | [] [] [] [] | + gstreamer | [] [] [] | + gtick | [] | + gtkam | [] [] [] [] | + gtkorphan | [] | + gtkspell | [] [] [] [] [] [] [] [] | + gutenprint | [] | + hello | [] [] [] [] [] [] [] [] | + id-utils | [] [] [] [] | + impost | [] | + indent | [] [] [] [] [] [] | + iso_3166 | [] [] [] [] [] [] | + iso_3166_2 | | + iso_4217 | [] [] [] [] | + iso_639 | [] [] [] [] | + jpilot | | + jtag | [] | + jwhois | [] [] [] [] | + kbd | [] [] [] | + keytouch | [] | + keytouch-editor | [] | + keytouch-keyboa... | [] | + latrine | [] [] | + ld | [] | + leafpad | [] [] [] [] [] [] | + libc | [] [] [] [] [] | + libexif | [] | + libextractor | [] [] | + libgpewidget | [] [] [] [] [] [] [] | + libgpg-error | [] [] | + libgphoto2 | [] | + libgphoto2_port | [] [] [] | + libgsasl | [] [] [] [] | + libiconv | [] [] | + libidn | [] [] () | + lifelines | [] [] | + lilypond | | + lingoteach | [] | + lynx | [] [] [] | + m4 | [] [] [] [] [] | + mailutils | [] [] [] [] | + make | [] [] [] [] | + man-db | [] [] | + minicom | [] [] [] [] [] | + mysecretdiary | [] [] [] [] | + nano | [] [] [] | + nano_1_0 | [] [] [] [] | + opcodes | [] [] | + parted | [] | + pilot-qof | [] | + psmisc | [] [] | + pwdutils | [] [] | + python | | + qof | [] [] | + radius | [] [] | + recode | [] [] [] [] [] [] [] | + rpm | [] [] [] [] | + screem | | + scrollkeeper | [] [] [] [] [] [] [] | + sed | [] [] [] [] [] [] [] [] [] | + sh-utils | [] [] [] | + shared-mime-info | [] [] [] [] [] | + sharutils | [] [] [] [] | + shishi | [] | + silky | [] | + skencil | [] [] [] | + sketch | [] [] [] | + solfege | [] | + soundtracker | [] [] | + sp | | + stardict | [] [] [] | + system-tools-ba... | [] [] [] [] [] [] [] [] [] | + tar | [] [] [] [] [] | + texinfo | [] [] [] [] | + textutils | [] [] [] | + tin | () | + tp-robot | [] | + tuxpaint | [] [] [] [] [] | + unicode-han-tra... | | + unicode-transla... | | + util-linux | [] [] [] [] | + vorbis-tools | [] [] | + wastesedge | | + wdiff | [] [] [] [] [] [] | + wget | [] [] [] [] | + xchat | [] [] [] [] [] [] [] | + xkeyboard-config | [] [] | + xpad | [] [] [] | + +------------------------------------------------------+ + nso or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta + 0 2 3 58 30 54 5 73 72 4 40 46 11 50 128 2 + + tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu + +---------------------------------------------------+ + GNUnet | [] | 2 + a2ps | [] [] [] | 19 + aegis | | 0 + ant-phone | [] [] | 6 + anubis | [] [] [] | 11 + ap-utils | () [] | 4 + aspell | [] [] [] | 15 + bash | [] | 11 + batchelor | [] [] | 9 + bfd | | 1 + bibshelf | [] | 7 + binutils | [] [] [] | 9 + bison | [] [] [] | 19 + bison-runtime | [] [] [] | 15 + bluez-pin | [] [] [] [] [] [] | 28 + cflow | [] [] | 5 + clisp | | 6 + console-tools | [] [] | 5 + coreutils | [] [] | 16 + cpio | [] [] [] | 9 + cpplib | [] [] [] [] | 11 + cryptonit | | 5 + darkstat | [] () () | 15 + dialog | [] [] [] [] [] | 30 + diffutils | [] [] [] [] | 28 + doodle | [] | 6 + e2fsprogs | [] [] | 10 + enscript | [] [] [] | 16 + error | [] [] [] [] | 18 + fetchmail | [] [] | 12 + fileutils | [] [] [] | 18 + findutils | [] [] [] | 17 + flex | [] [] | 15 + fslint | [] | 9 + gas | [] | 3 + gawk | [] [] | 15 + gbiff | [] | 5 + gcal | [] | 5 + gcc | [] [] [] | 6 + gettext-examples | [] [] [] [] [] [] | 27 + gettext-runtime | [] [] [] [] [] [] | 28 + gettext-tools | [] [] [] [] [] | 19 + gimp-print | [] [] | 12 + gip | [] [] | 12 + gliv | [] [] | 8 + glunarclock | [] [] [] | 15 + gmult | [] [] [] [] | 15 + gnubiff | [] | 1 + gnucash | () | 2 + gnucash-glossary | [] [] | 9 + gnuedu | [] | 2 + gnulib | [] [] [] [] [] | 28 + gnunet-gtk | | 1 + gnutls | | 2 + gpe-aerial | [] [] | 14 + gpe-beam | [] [] | 14 + gpe-calendar | [] | 3 + gpe-clock | [] [] [] [] | 21 + gpe-conf | [] [] | 14 + gpe-contacts | [] [] | 10 + gpe-edit | [] [] [] [] | 20 + gpe-filemanager | [] | 6 + gpe-go | [] [] | 15 + gpe-login | [] [] [] [] [] | 21 + gpe-ownerinfo | [] [] [] [] | 21 + gpe-package | [] | 6 + gpe-sketchbook | [] [] | 16 + gpe-su | [] [] [] | 20 + gpe-taskmanager | [] [] [] | 20 + gpe-timesheet | [] [] [] [] | 18 + gpe-today | [] [] [] [] [] | 21 + gpe-todo | [] | 7 + gphoto2 | [] [] [] [] | 20 + gprof | [] [] | 11 + gpsdrive | | 4 + gramadoir | [] | 7 + grep | [] [] [] [] | 34 + gretl | | 4 + gsasl | [] [] | 8 + gss | [] | 5 + gst-plugins | [] [] [] | 15 + gst-plugins-base | [] [] [] | 9 + gst-plugins-good | [] [] [] [] [] | 20 + gstreamer | [] [] [] | 17 + gtick | [] | 3 + gtkam | [] | 13 + gtkorphan | [] | 7 + gtkspell | [] [] [] [] [] [] | 26 + gutenprint | | 3 + hello | [] [] [] [] [] | 37 + id-utils | [] [] | 14 + impost | [] | 4 + indent | [] [] [] [] | 25 + iso_3166 | [] [] [] [] | 16 + iso_3166_2 | | 2 + iso_4217 | [] [] | 14 + iso_639 | [] | 14 + jpilot | [] [] [] [] | 7 + jtag | [] | 3 + jwhois | [] [] [] | 13 + kbd | [] [] | 12 + keytouch | [] | 4 + keytouch-editor | | 2 + keytouch-keyboa... | [] | 3 + latrine | [] [] | 8 + ld | [] [] [] [] | 8 + leafpad | [] [] [] [] | 23 + libc | [] [] [] | 23 + libexif | [] | 4 + libextractor | [] | 5 + libgpewidget | [] [] [] | 19 + libgpg-error | [] | 4 + libgphoto2 | [] | 8 + libgphoto2_port | [] [] [] | 11 + libgsasl | [] | 8 + libiconv | [] | 7 + libidn | [] [] | 10 + lifelines | | 4 + lilypond | | 2 + lingoteach | [] | 6 + lynx | [] [] [] | 15 + m4 | [] [] [] | 18 + mailutils | [] | 8 + make | [] [] [] | 20 + man-db | [] | 6 + minicom | [] | 14 + mysecretdiary | [] [] | 12 + nano | [] [] | 17 + nano_1_0 | [] [] [] | 18 + opcodes | [] [] | 10 + parted | [] [] [] | 10 + pilot-qof | [] | 3 + psmisc | [] | 10 + pwdutils | [] | 3 + python | | 0 + qof | [] | 4 + radius | [] | 6 + recode | [] [] [] | 25 + rpm | [] [] [] [] | 14 + screem | [] | 2 + scrollkeeper | [] [] [] [] | 26 + sed | [] [] [] | 22 + sh-utils | [] | 15 + shared-mime-info | [] [] [] [] | 24 + sharutils | [] [] [] | 23 + shishi | | 1 + silky | [] | 4 + skencil | [] | 7 + sketch | | 6 + solfege | | 2 + soundtracker | [] [] | 9 + sp | [] | 3 + stardict | [] [] [] [] | 11 + system-tools-ba... | [] [] [] [] [] [] [] | 37 + tar | [] [] [] [] | 20 + texinfo | [] [] [] | 15 + textutils | [] [] [] | 17 + tin | | 1 + tp-robot | [] [] [] | 10 + tuxpaint | [] [] [] | 16 + unicode-han-tra... | | 0 + unicode-transla... | | 2 + util-linux | [] [] [] | 20 + vorbis-tools | [] [] | 11 + wastesedge | | 1 + wdiff | [] [] | 22 + wget | [] [] [] | 19 + xchat | [] [] [] [] | 29 + xkeyboard-config | [] [] [] [] | 11 + xpad | [] [] [] | 14 + +---------------------------------------------------+ + 77 teams tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu + 170 domains 0 1 1 77 39 0 136 10 1 48 5 54 0 2028 + + Some counters in the preceding matrix are higher than the number of +visible blocks let us expect. This is because a few extra PO files are +used for implementing regional variants of languages, or language +dialects. + + For a PO file in the matrix above to be effective, the package to +which it applies should also have been internationalized and +distributed as such by its maintainer. There might be an observable +lag between the mere existence a PO file and its wide availability in a +distribution. + + If October 2006 seems to be old, you may fetch a more recent copy of +this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date +matrix with full percentage details can be found at +`http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'. + +1.6 Using `gettext' in new packages +=================================== + +If you are writing a freely available program and want to +internationalize it you are welcome to use GNU `gettext' in your +package. Of course you have to respect the GNU Library General Public +License which covers the use of the GNU `gettext' library. This means +in particular that even non-free programs can use `libintl' as a shared +library, whereas only free software can use `libintl' as a static +library or use modified versions of `libintl'. + + Once the sources are changed appropriately and the setup can handle +the use of `gettext' the only thing missing are the translations. The +Free Translation Project is also available for packages which are not +developed inside the GNU project. Therefore the information given above +applies also for every other Free Software Project. Contact +`translation@iro.umontreal.ca' to make the `.pot' files available to +the translation teams. + diff --git a/guile18/ANNOUNCE b/guile18/ANNOUNCE new file mode 100644 index 0000000000..bfbda73162 --- /dev/null +++ b/guile18/ANNOUNCE @@ -0,0 +1,60 @@ +We are pleased to announce the release of Guile 1.8.0. It can be +found here: + + ftp://ftp.gnu.org/gnu/guile/guile-1.8.0.tar.gz + +Its SHA1 checksum is + + 22462680feeda1e5400195c01dee666162503d66 guile-1.8.0.tar.gz + +We already know about some issues with 1.8.0, please check the mailing +lists: + + http://www.gnu.org/software/guile/mail/mail.html + +The NEWS file is quite long. Here are the most interesting entries: + + Changes since 1.6: + + * Guile is now licensed with the GNU Lesser General Public License. + + * The manual is now licensed with the GNU Free Documentation License. + + * We now use GNU MP for bignums. + + * We now have exact rationals, such as 1/3. + + * We now use native POSIX threads for real concurrent threads. + + * There is a new way to initalize Guile that allows one to use Guile + from threads that have not been created by Guile. + + * Mutexes and condition variables are now always fair. A recursive + mutex must be requested explicitly. + + * The low-level thread API has been removed. + + * There is now support for copy-on-write substrings and + mutation-sharing substrings. + + * A new family of functions for converting between C values and + Scheme values has been added that is future-proof and thread-safe. + + * The INUM macros like SCM_MAKINUM have been deprecated. + + * The macros SCM_STRINGP, SCM_STRING_CHARS, SCM_STRING_LENGTH, + SCM_SYMBOL_CHARS, and SCM_SYMBOL_LENGTH have been deprecated. + + * There is a new way to deal with non-local exits and re-entries in + C code, which is nicer than scm_internal_dynamic_wind. + + * There are new malloc-like functions that work better than + scm_must_malloc, etc. + + * There is a new way to access all kinds of vectors and arrays from + C that is efficient and thread-safe. + + * The concept of dynamic roots has been factored into continuation + barriers and dynamic states. + +See NEWS and the manual for more details. diff --git a/guile18/AUTHORS b/guile18/AUTHORS new file mode 100644 index 0000000000..ed2adbab72 --- /dev/null +++ b/guile18/AUTHORS @@ -0,0 +1,345 @@ +To find out what should go in this file, see "Information For +Maintainers of GNU Software" (maintain.texi), the section called +"Recording Changes". + + +Aubrey Jaffer: +is the author of SCM, the Scheme interpreter upon which Guile is +based. Guile started from SCM version 4e1 in November -94 and is +still largely composed of the original SCM code. + +George Carrette: +wrote files present in Siod version 2.3, released in December of 1989. +Siod was the starting point for SCM. The major innovations taken from +Siod are the evaluator's use of the C-stack and being able to garbage +collect off the C-stack + +Radey Shouman: +In the subdirectory libguile, wrote: + gsubr.c ramap.c unif.c + gsubr.h ramap.h unif.h + +Gary Houston: +In the subdirectory libguile, wrote: + rw.c +In the subdirectory ice-9, wrote: + expect.scm networking.scm popen.scm posix.scm rw.scm +In the subdirectory doc, changes to: + data-rep.texi expect.texi guile-tut.texi + posix.texi r5rs.texi scheme-io.texi +Many other changes throughout. + +Jim Blandy: Many changes throughout. +In the subdirectory libguile, wrote: + script.c (partially) +In the subdirectory doc, wrote: + data-rep.texi env.texi mbapi.texi + mltext.texi hacks.el +In the subdirectory doc/example-smob, wrote: + image-type.c image-type.h myguile.c + +Tom Lord: Many changes throughout. +In the subdirectory ice-9, wrote: + Makefile.in configure.in lineio.scm poe.scm + boot-9.scm hcons.scm mapping.scm + +Anthony Green: wrote the following files in libguile: + coop-defs.h coop-threads.h fsu-pthreads.h mit-pthreads.h threads.h + coop-threads.c coop.c mit-pthreads.c threads.c +and ice-9/threads.scm. + +Mikael Djurfeldt: +In the subdirectory ice-9, wrote: + documentation.scm emacs.scm stack-catch.scm + null.scm r5rs.scm safe-r5rs.scm safe.scm + receive.scm occam-channel.scm syncase.scm +In the subdirectory ice-9, changes to: + boot-9.scm psyntax.ss slib.scm threads.scm +In the subdirectory oop, wrote: + goops.scm +In the subdirectory oop/goops, wrote: + compile.scm dispatch.scm internal.scm old-define-method.scm save.scm + stklos.scm util.scm +In the subdirectory oop/goops, rewrote files from STKlos: + active-slot.scm composite-slot.scm describe.scm +In the subdirectory libguile, wrote: + backtrace.c debug.c options.c root.c srcprop.c stacks.c + backtrace.h debug.h options.h root.h srcprop.h stacks.h + iselect.c gdbint.c objects.c objprop.c stackchk.c modules.c + iselect.h gdbint.h objects.h objprop.h stackchk.h modules.h + random.c futures.c evalext.c goops.c hooks.c macros.c + random.h futures.h evalext.h goops.h hooks.h macros.h + gdb_interface.h +In the subdirectory libguile, rewrote: + coop-threads.c coop.c mit-pthreads.c threads.c print.c + coop-threads.h fsu-pthreads.h mit-pthreads.h threads.h print.h +In the subdirectory srfi, wrote: + srfi.c + srfi.h +In the subdirectory doc, wrote: + goops-tutorial.texi hierarchy.eps + hierarchy.txt mop.txt oldfmt.c +In the subdirectory doc, changes to: + data-rep.texi gh.texi goops.texi +Many other changes throughout. + +Mark Galassi: +Designed and implemented the high-level libguile API (the @code{gh_} +interface), based largely on the defunct @code{gscm_} interface. In the +subdirectory libguile, wrote: +gh.h gh_funcs.c gh_list.c gh_test_repl.c +gh_data.c gh_init.c gh_predicates.c +gh_eval.c gh_io.c gh_test_c.c +In the subdirectory doc, wrote: + appendices.texi gh.texi guile-tut.texi + +Marius Vollmer: Many changes throughout. +In the subdirectory libguile, wrote: + fluids.c fluids.h extensions.h + deprecation.h deprecation.c extensions.c +In the subdirectory libguile, rewrote: + dynl.c dynl-dl.c dynl-shl.c + dynl.h dynl-dld.c +In the subdirectory doc, changes to: + data-rep.texi intro.texi posix.texi + scheme-modules.texi +In the subdirectory ice-9, wrote + and-let-star-compat.scm + +R. Kent Dybvig: +In the subdirectory ice-9, wrote: + psyntax.ss + +Roland Orre: +In the subdirectory libguile, wrote: + sort.c + sort.h +In the subdirectory ice-9, wrote: + session.scm + +Michael Livshin: Some changes throughout. +Implemented support for double-word heap cells and converted some +smobs to use them. +In the subdirectory libguile, wrote: + guardians.c guardians.h filter-doc-snarfage.c + guile-snarf-docs.in guile-snarf-docs-texi.in +In the subdirectory libguile, changed extensively: + gc.c gc.h +In the subdirectory ice-9, wrote: + streams.scm and-let*.scm +In the subdirectory scripts, wrote: + snarf-check-and-output-texi + +Tim Pierce: +In the subdirectory libguile, wrote: + regex-posix.c + regex-posix.h +In the subdirectory doc, changes to: + appendices.texi posix.texi + +Rob Browning: + wrote initial srfi/srfi-2.scm. + wrote initial srfi/srfi-6.scm. + wrote initial srfi/srfi-8.scm. + wrote initial srfi/srfi-11.scm. + ported srfi/srfi-19.scm to Guile. + and many other changes throughout. + +Martin Grabmueller: +In the subdirectory libguile, changes to: + backtrace.c eval.c strorder.c script.c + strop.c strop.h struct.c macros.c + numbers.c posix.h posix.c symbols.c + gh_data.c strports.h strports.c validate.h + read.c + and many docstrings changes throughout. +In the subdirectory srfi, wrote: + srfi-1.scm srfi-9.scm srfi-10.scm + srfi-13.scm srfi-14.scm srfi-13.c + srfi-14.c srfi-13.h srfi-14.h + srfi-16.scm srfi-4.c srfi-4.h + srfi-4.scm +In the subdirectory scripts, wrote: + doc-snarf +In the subdirectory doc, wrote: + script-getopt.texi srfi-modules.texi + repl-modules.texi misc-modules.texi +In the subdirectory doc, changes to: + guile.texi intro.texi posix.texi + scheme-binding.texi scheme-control.texi + scheme-data.texi scheme-evaluation.texi + scheme-indices.texi scheme-io.texi + scheme-memory.texi scheme-modules.texi + scheme-options.texi scheme-procedures.texi + scheme-scheduling.texi scheme-utility.texi +In the subdirectory example, wrote + scripts modules safe + box box-module box-dynamic +In the subdirectory test-suite/tests, wrote: + srfi-4.test srfi-9.test srfi-10.test + srfi-13.test + +Will Fitzgerald: + wrote initial srfi/srfi-19.scm. + +Jost Boekemeier: +In the subdirectory libguile, wrote: + environments.c, environments.h + +Dirk Herrmann: +In the subdirectory doc, changes to: + data-rep.texi, scm.texi +In the subdirectory libguile, rewrote: + environments.c, environments.h +In the subdirectory libguile, changes to: + error.c, gc.c, gc.h, numbers.c, strings.c, symbols.c +In the subdirectory test-suite, rewrote: + lib.scm +In the subdirectory test-suite/tests, wrote: + bit-operations.test, common-list.test, environments.test, eval.test, + gc.test, list.test, numbers.test, symbols.test, syntax.test +Many other changes throughout. + +Greg Badros: +In the subdirectory doc, changes to: + data-rep.texi +Many changes throughout. + +Neil Jerram: +In the subdirectory ice-9, wrote: + buffered-input.scm +In the subdirectory doc, wrote: + deprecated.texi goops.texi scheme-ideas.texi + scheme-reading.texi +In the subdirectory doc, changes to: + appendices.texi data-rep.texi expect.texi + extend.texi gh.texi guile-tut.texi + guile.texi indices.texi intro.texi + posix.texi preface.texi r5rs.texi + scheme-binding.texi scheme-modules.texi + scheme-control.texi scheme-data.texi + scheme-debug.texi scheme-evaluation.texi + scheme-ideas.texi scheme-indices.texi + scheme-intro.texi scheme-io.texi + scheme-memory.texi scheme-options.texi + scheme-procedures.texi scheme-scheduling.texi + scheme-translation.texi scheme-utility.texi + scm.texi scripts.texi script-getopt.texi +In the subdirectory doc/maint, wrote: + docstring.el + +Thien-Thi Nguyen: +In the top-level directory, wrote: + check-guile.in guile-tools.in +In the subdirectory ice-9, changes to: + boot-9.scm documentation.scm emacs.scm + ls.scm session.scm string-fun.scm + threads.scm getopt-long.scm +In the subdirectory scripts, wrote: + Makefile.am PROGRAM + display-commentary generate-autoload + punify read-scheme-source + use2dot +In the subdirectory scripts, changes to: + doc-snarf +In the subdirectory libguile, changes to: + guile-doc-snarf.in regex-posix.c +In the subdirectory doc, changes to: + intro.texi preface.texi + scheme-modules.texi scheme-procedures.texi + scheme-scheduling.texi +In the subdirectory test-suite, changes to: + guile-test lib.scm +In the subdirectory test-suite/tests, wrote: + exceptions.test getopt-long.test +In the subdirectory test-suite/tests, changes to: + eval.test + +Robert Merkel: +In the subdirectory doc, co-wrote: + guile.1 + +Marc Feeley: +In the subdirectory doc, wrote: + pretty-print.scm + +Matthias Koeppe: +In the subdirectory test-suite/tests, wrote: + format.test, srfi-19.test, optargs.test +In the subdirectory test-suite/tests, changes to: + ports.test + +The file libguile/gc_os_dep.c is from the Boehm-Weiser conservative +collector. A lot of people have contributed to it, but probably not +all to the code in gc_os_dep.c: + + The SPARC specific code was contributed by Mark Weiser + (weiser@parc.xerox.com). The Encore Multimax modifications were + supplied by Kevin Kenny (kenny@m.cs.uiuc.edu). The adaptation to + the RT is largely due to Vernon Lee (scorpion@rice.edu), on + machines made available by IBM. Much of the HP specific code and + a number of good suggestions for improving the generic code are + due to Walter Underwood (wunder@hp-ses.sde.hp.com). Robert + Brazile (brazile@diamond.bbn.com) originally supplied the ULTRIX + code. Al Dosser (dosser@src.dec.com) and Regis Cridlig + (Regis.Cridlig@cl.cam.ac.uk) subsequently provided updates and + information on variation between ULTRIX systems. Parag Patel + (parag@netcom.com) supplied the A/UX code. Jesper + Peterson(jep@mtiame.mtia.oz.au), Michel Schinz, and Martin + Tauchmann (martintauchmann@bigfoot.com) supplied the Amiga port. + Thomas Funke (thf@zelator.in-berlin.de(?)) and Brian D.Carlstrom + (bdc@clark.lcs.mit.edu) supplied the NeXT ports. Douglas Steel + (doug@wg.icl.co.uk) provided ICL DRS6000 code. Bill Janssen + (janssen@parc.xerox.com) supplied the SunOS dynamic loader + specific code. Manuel Serrano (serrano@cornas.inria.fr) supplied + linux and Sony News specific code. Al Dosser provided Alpha/OSF/1 + code. He and Dave Detlefs(detlefs@src.dec.com) also provided + several generic bug fixes. Alistair G. Crooks(agc@uts.amdahl.com) + supplied the NetBSD and 386BSD ports. Jeffrey Hsu + (hsu@soda.berkeley.edu) provided the FreeBSD port. Brent Benson + (brent@jade.ssd.csd.harris.com) ported the collector to a Motorola + 88K processor running CX/UX (Harris NightHawk). Ari Huttunen + (Ari.Huttunen@hut.fi) generalized the OS/2 port to nonIBM + development environments (a nontrivial task). Patrick Beard + (beard@cs.ucdavis.edu) provided the initial MacOS port. David + Chase, then at Olivetti Research, suggested several improvements. + Scott Schwartz (schwartz@groucho.cse.psu.edu) supplied some of the + code to save and print call stacks for leak detection on a SPARC. + Jesse Hull and John Ellis supplied the C++ interface code. Zhong + Shao performed much of the experimentation that led to the current + typed allocation facility. (His dynamic type inference code + hasn't made it into the released version of the collector, yet.) + (Blame for misinstallation of these modifications goes to the + first author, however.) + +Keisuke Nishida: [added by ttn; kei, please review] +In the top-level directory, changes to: + libguile.h +In the subdirectory ice-9, wrote: + channel.scm history.scm time.scm + match.scm +In the subdirectory ice-9, changes to: + boot-9.scm receive.scm safe-r5rs.scm + common-list.scm +In the subdirectory emacs, wrote: + guile.el guile-scheme.el guile-emacs.scm +In the subdirectory libguile, changes to: + goops.c vectors.h vectors.c + eval.c hashtab.h hashtab.c + environments.c smob.h smob.c + keywords.c list.c strports.c + tag.c Makefile.am guile-snarf.awk.in +Many other changes throughout. + +Stefan Jahn: +In the subdirectory libguile, changes to: + continuations.h + continuations.c + gc.c + +John W. Eaton, based on code from AT&T Bell Laboratories and Bellcore: + The complex number division method in libguile/numbers.c. + +Gregory Marton: +In the subdirectory test-suite/tests, changes to: + hash.test diff --git a/guile18/COPYING.LESSER b/guile18/COPYING.LESSER new file mode 100644 index 0000000000..8add30ad59 --- /dev/null +++ b/guile18/COPYING.LESSER @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/guile18/ChangeLog b/guile18/ChangeLog new file mode 100644 index 0000000000..10501f33f6 --- /dev/null +++ b/guile18/ChangeLog @@ -0,0 +1,17 @@ +-*- text -*- + +Starting from September 1st, 2008, the Guile project no longer stores +change logs in `ChangeLog' files. Instead, changes are detailed in the +version control system's logs. They can be seen by downloading a copy +of the Git repository: + + $ git clone git://git.sv.gnu.org/guile.git + $ git whatchanged + +Alternatively, they can be seen on the web, using the Gitweb interface +at: + + http://git.sv.gnu.org/gitweb/?p=guile.git + +Change logs up to September 1st, 2008, are still available in the files +named `ChangeLog-2008'. diff --git a/guile18/ChangeLog-2008 b/guile18/ChangeLog-2008 new file mode 100644 index 0000000000..3d8b7e8dbd --- /dev/null +++ b/guile18/ChangeLog-2008 @@ -0,0 +1,3315 @@ +2008-08-20 Ludovic Courtès + + * configure.in: Use `AC_USE_SYSTEM_EXTENSIONS' instead of the + obsolete `AC_AIX', `AC_ISC_POSIX' and `AC_MINIX'. As a side + effect, this will define `_POSIX_PTHREAD_SEMANTICS' on Solaris, + which provides a standard-conforming version of `readdir_r ()' + for instance; it also allows the use of Autoconf 2.62. + +2008-08-14 Ludovic Courtès + + * configure.in: Remove incorrect and pointless + `AC_CONFIG_MACRO_DIR' invocation. Reported as Gentoo bug + #220339. + +2008-08-07 Neil Jerram + + * configure.in (SCM_I_GSC_STACK_GROWS_UP): Remove use of + AC_CACHE_CHECK, which was inadvertently causing + SCM_I_GSC_STACK_GROWS_UP _always_ to be 0. + +2008-07-17 Neil Jerram + + * configure.in: Update stack direction test to be like that in + Autoconf _AC_LIBOBJ_ALLOCA and Gnulib; specifically in involving a + function calling itself. + +2008-07-16 Ludovic Courtès + + * configure.in: Look for `struct dirent64' and `readdir64_r ()', + not available on HP-UX 11.11. + +2008-07-06 Ludovic Courtès + + * configure.in: Update to Autoconf 2.61. + +2008-06-28 Ludovic Courtès + + * configure.in: Use Automake with `-Wall -Wno-override'. + +2008-05-07 Ludovic Courtès + + Guile 1.8.5 released. + + * GUILE-VERSION (LIBGUILE_INTERFACE_CURRENT): Increment due to + the addition of an inlined version of `scm getc ()' and friends. + (LIBGUILE_INTERFACE_AGE): Increment. + (LIBGUILE_INTERFACE_REVISION): Zeroed. + (LIBGUILE_SRFI_SRFI_1_INTERFACE_REVISION): Increment. + +2008-05-04 Ludovic Courtès + + Add `pkg-config' support. Suggested by Aaron VanDevender, Greg + Troxel, and others. + + * configure.in: Substitute `sitedir', produce `guile-1.8.pc'. + * Makefile.am (EXTRA_DIST): Add `guile-1.8.pc.in'. + (pkgconfigdir, pkgconfig_DATA): New. + +2008-04-26 Ludovic Courtès + + * configure.in (BUILD_PTHREAD_SUPPORT): New Automake + conditional. + +2008-04-26 Ludovic Courtès + + * Makefile.am (EXTRA_DIST): Remove `ANON-CVS' and `SNAPSHOTS'. + +2008-03-12 Neil Jerram + + * configure.in (AC_CONFIG_FILES): Add emacs/Makefile and + ice-9/debugging/Makefile. + + * Makefile.am (SUBDIRS): Add emacs. + +2008-02-23 Neil Jerram + + * FAQ: New file. + + * Makefile.am (EXTRA_DIST): Add FAQ + +2008-02-22 Ludovic Courtès + + * configure.in: Check whether `strncasecmp' is declared. + +2008-02-16 Ludovic Courtès + + Guile 1.8.4 released. + + * GUILE-VERSION (LIBGUILE_INTERFACE_REVISION): Increment. + (GUILE_MICRO_VERSION): Increment. + + * configure.in (GUILE_CFLAGS): Include `$CPPFLAGS' since they + may include required `-I' flags (e.g., `-I/path/to/gmp'), so + that "guile-config compile" reports all the needed flags. + +2008-02-15 Neil Jerram + + * autogen.sh: Copy versions of config.guess and config.sub from + Guile CVS to build-aux and guile-readline. + +2008-02-14 Neil Jerram + + * HACKING: Note need for libtool >= 1.5.26. + + * config.rpath, build-aux/config.rpath: Updated to latest upstream + version. + + * config.guess, config.sub: 2008-01-07 versions added to Guile + CVS, to ensure that Guile developers are using new enough versions + (in particular for AIX 6.1 support). + +2008-02-11 Neil Jerram + + * configure.in (--without-64-calls): Use AC_MSG_CHECKING and + AC_MSG_RESULT instead of just echo. + (GUILE_I): New programs to try using _Complex_I or 1.0fi for the + imaginary unit. + +2008-02-06 Neil Jerram + + * configure.in: Default to --without-64-calls for + powerpc-ibm-aix*. Thanks to Rainer Tammer for reporting that the + 64 calls are a problem on that OS. + +2008-02-06 Ludovic Courtès + + * NEWS: Mention Sun Studio compilation fix. + +2008-02-05 Neil Jerram + + * configure.in (--without-64-calls): New option. + +2008-01-30 Neil Jerram + + * pre-inst-guile.in (dyld_prefix), pre-inst-guile-env.in + (dyld_prefix): Construct and export dyld_prefix in a similar way + to ltdl_prefix, to allow pre-install dynamic linking to work on + MacOS. Thanks to Roger Mc Murtrie for reporting this problem. + +2008-01-22 Neil Jerram + + * README: Should say version 1.8.3, not 1.8.2. + + * LICENSE: Change COPYING.LIB to COPYING.LESSER. + + * COPYING.LESSER: Renamed, previously COPYING.LIB. + + * COPYING: Removed. + + * libguile.h: Update copyright statement to LGPL. + +2007-12-04 Ludovic Courtès + + * NEWS: Mention `accept' and `scm_c_{read,write}' bug fixes. + +2007-12-03 Ludovic Courtès + + * NEWS: Add SRFI-69. + +2007-10-17 Ludovic Courtès + + * NEWS: Mention reader bug-fix. + +2007-10-16 Ludovic Courtès + + Guile 1.8.3 released. + + * GUILE-VERSION (GUILE_MICRO_VERSION): Incremented. + (LIBGUILE_INTERFACE_REVISION): Incremented. + +2007-10-10 Ludovic Courtès + + * configure.in (SCM_I_GSC_NEED_BRACES_ON_PTHREAD_ONCE_INIT): + New substituted variable. + Use `-Werror' when using GCC and checking for + `PTHREAD_ONCE_INIT'. Add check for braces around + `PTHREAD_MUTEX_INITIALIZER'. + * NEWS: Mention build fix for IRIX. + +2007-10-02 Ludovic Courtès + + * NEWS: Mention `(ice-9 slib)' fix and threading fix. + +2007-09-03 Ludovic Courtès + + * NEWS: Mention alignment-related bug fixes. + +2007-09-03 Kevin Ryde + + * configure.in (AC_CHECK_FUNCS): Add clog and cexp. + +2007-09-02 Ludovic Courtès + + * NEWS: Mention memory leak fix in `make-socket-address'. + +2007-09-01 Ludovic Courtès + + * NEWS: Mention duplicate binding warnings to stderr. + +2007-08-23 Ludovic Courtès + + * NEWS: Mention Solaris bug fixes. + +2007-08-11 Ludovic Courtès + + * NEWS: Mention SRFI-35 and the new reader. + + * configure.in: Check for and `strncasecmp ()'. + +2007-08-08 Ludovic Courtès + + * NEWS: Mention changes to `record-accessor' and + `record-modifier'. + +2007-08-03 Ludovic Courtès + + * configure.in: Use `build-aux' as `AC_CONFIG_AUX_DIR', and `m4' + as `AC_CONFIG_MACRO_DIR'. Use Automake's `gnu' and `check-news' + options. + +2007-07-25 Ludovic Courtès + + * NEWS: Mention bug fix for "(set! 'x #f)". + +2007-07-18 Ludovic Courtès + + * NEWS: Mention SRFI-37. + +2007-07-15 Ludovic Courtès + + Guile 1.8.2 released. + + * NEWS: Mention HP-UX/IA64 build fixes. + + * THANKS: Added people who reported bugs or sent patches since + 1.8.1. Converted to UTF-8. + + * README: Updated version number. + + * Makefile.am (EXTRA_DIST): Removed `BUGS' (was outdated). + + * ANON-CVS, HACKING, SNAPSHOTS: New, from the `workbook' + directory of the CVS repository. + + * autogen.sh: Removed dependency on the `workbook' CVS + directory. + + * GUILE-VERSION (GUILE_MICRO_VERSION): Set to 2. + (LIBGUILE_INTERFACE_CURRENT): Incremented due to new symbols. + (LIBGUILE_INTERFACE_REVISION): Set to 0. + (LIBGUILE_INTERFACE_AGE): Incremented. + (LIBGUILE_SRFI_SRFI_60_INTERFACE_REVISION): Incremented due to + bug fixes. + +2007-07-11 Ludovic Courtès + + * NEWS: Mention GOOPS `method-more-specific?' bug fix. + +2007-07-09 Ludovic Courtès + + * NEWS: Mention SRFI-19 `date->julian-day' bug fix. + +2007-06-26 Ludovic Courtès + + * NEWS: Mention fixed memory leaks. + +2007-06-13 Ludovic Courtès + + * NEWS: Mention top-level define incompatible change. + +2007-06-12 Ludovic Courtès + + * NEWS: Mention `inet-ntop' bug fix. + +2007-05-09 Ludovic Courtès + + * NEWS: Mention SRFI-19 `time-process' bug fix. + +2007-02-20 Neil Jerram + + * config.rpath (Module): New (from gettext package). + + * INSTALL: New upstream version. + + * ABOUT-NLS: New upstream version. + +2007-01-28 Neil Jerram + + IA64 HP-UX patch from Hrvoje NikÅ¡ić. (Thanks!) + + * configure.in: New check for uca lib (needed for IA64 on HP-UX). + +2007-01-23 Kevin Ryde + + * configure.in (isinf, isnan): Use a volatile global to stop gcc + optimizing out the test. In particular this fixes solaris where there + isn't an isinf or isnan (though gcc still optimizes as if there is). + Reported by Hugh Sasse. + (AC_C_VOLATILE): New. + +2007-01-22 Kevin Ryde + + * configure.in (AC_INIT): Don't use "echo -n", it's not portable and + in particular fails on solaris (resulting in literal "-n"s going into + the output, making the resulting configure unusable). Reported by + Hugh Sasse. + +2006-12-27 Kevin Ryde + + * configure.in (pthread_get_stackaddr_np, pthread_sigmask): New tests. + +2006-12-24 Han-Wen Nienhuys + + * autogen.sh (mscripts): only execute render-bugs if it exists. + +2006-12-23 Kevin Ryde + + * configure.in (-lm): No need to suppress libm on mingw, it's not + needed because it's empty, but including it does no harm. + (-lm): Look for "cos" instead of "main", since cos and friends are the + purpose of looking for libm. + (winsock etc): Test $host = *-*-mingw* rather than $MINGW32, autoconf + regards the latter as obsolete. + (AC_MINGW32): Remove test, $MINGW32 now unused. + (uint32_t): Look at HAVE_NETDB_H rather than hard-coding __MINGW32__ + in the test program. + +2006-12-15 Kevin Ryde + + * configure.in (process.h, pipe, _pipe): New checks. + +2006-12-14 Kevin Ryde + + * configure.in (struct timespec, pthread.h): Look for struct timespec + in as well as , it's in pthread.h on mingw. + Reported by Nils Durner. + +2006-12-03 Kevin Ryde + + * Makefile.am (AUTOMAKE_OPTIONS): Bump to automake 1.10 required, so + that config.rpath from gettext will go into the dist (and give an + error if not). + + * configure.in (AM_PROG_CC_C_O): New macro, needed by automake 1.10 + for per-target cflags in libguile/Makefile.am. + +2006-11-08 Ludovic Courtès + + * configure.in: Pass `bug-guile@gnu.org' as a third argument to + `AC_INIT'. + +2006-10-06 Rob Browning + + Guile 1.8.1 released. + + * GUILE-VERSION (GUILE_MICRO_VERSION): Increment for release. + (LIBGUILE_INTERFACE_REVISION): Increment for release. + (LIBGUILE_SRFI_SRFI_1_INTERFACE_REVISION): Increment for release. + (LIBGUILE_SRFI_SRFI_4_INTERFACE_REVISION): Increment for release. + (LIBGUILE_SRFI_SRFI_13_14_INTERFACE_REVISION): Increment for release. + (LIBGUILE_SRFI_SRFI_60_INTERFACE_REVISION): Increment for release. + + * Makefile.am (EXTRA_DIST): Add LICENSE. + +2006-09-28 Kevin Ryde + + * configure.in (chsize, ftruncate, truncate): New tests, for mingw. + +2006-09-27 Kevin Ryde + + * configure.in (clog10): New test, not in mingw. + +2006-09-23 Kevin Ryde + + * configure.in (complex.h, complex double, csqrt): New tests. + +2006-09-20 Ludovic Courtès + + * configure.in: Check for `isblank ()'. + + * NEWS: Mentioned the interaction between `setlocale' and SRFI-14 + standard char sets. + +2006-08-22 Kevin Ryde + + * configure.in: Test if need braces around PTHREAD_ONCE_INIT, set + AC_OUTPUT of SCM_I_GSC_NEED_BRACES_ON_PTHREAD_ONCE_INIT. + +2006-07-25 Kevin Ryde + + * configure.in (AC_CHECK_FUNCS): Add pthread_getattr_np. + +2006-07-24 Kevin Ryde + + * configure.in (AC_CHECK_DECLS): Add sethostname for Solaris 10. + (AC_CHECK_FUNCS): Remove dirfd, it's a macro. + Reported by Claes Wallin. + +2006-06-25 Kevin Ryde + + * configure.in (AC_CHECK_MEMBERS): Test struct tm.tm_gmtoff. + +2006-06-13 Ludovic Courtès + + * NEWS: Mentioned the new behavior of `equal?' for structures. + +2006-06-06 Neil Jerram + + * acinclude.m4 (ACX_PTHREAD): Update to latest definition from + autoconf macro archive, to fix pthread linking problem on Solaris + 10, reported by Charles Gagnon. + +2006-05-28 Kevin Ryde + + * configure.in (isnan): Remove "#ifdef __MINGW32__, #define isnan + _isnan". Mingw provides isnan as a macro (in math.h), the test + already detects it just fine with no special case. + +2006-05-26 Kevin Ryde + + * configure.in (AC_CHECK_FUNCS): Add ioctl. + (pthread_attr_getstack): Restrict test to pthreads case, to avoid + AC_TRY_RUN when cross-compiling --without-threads. + +2006-05-20 Kevin Ryde + + * configure.in (S_ISLNK): Remove test, leave it to #ifdef in the .c + files. + +2006-05-16 Kevin Ryde + + * configure.in (struct stat st_blocks): Change AC_STRUCT_ST_BLOCKS to + a plain AC_CHECK_MEMBERS, we don't want AC_LIBOBJ(fileblocks) which + the former gives. Remove the commented-out code that was to have + munged fileblocks out of LIBOBJS. This fixes mingw, where the lack of + st_blocks and absense of the fileblocks.c replacement caused build + failure. Reported by "The Senator". + (struct stat st_rdev, st_blksize): Combine into a single + AC_CHECK_MEMBERS. + +2006-04-18 Rob Browning + + * configure.in: Add AC_CONFIG_AUX_DIR([.]) as suggested in the + autotools documentation. + +2006-04-16 Kevin Ryde + + * configure.in (stat64, off_t): New tests. + +2006-03-31 Kevin Ryde + + * configure.in (socklen_t): Enhance test for this type, coping with + need for on MacOS X. Reported by Michael Tuexen and + Jay Cotton. + +2006-03-26 Marius Vollmer + + * configure.in: Added check that defines + PTHREAD_ATTR_GETSTACK_WORKS when pthread_attr_getstack works for + the main thread. + +2006-02-26 Kevin Ryde + + * configure.in (AC_CHECK_FUNCS): Add dirfd. + +2006-02-20 Marius Vollmer + + Released 1.8.0. + + * GUILE-VERSION: Set version. + +2006-02-06 Marius Vollmer + + Branched for 1.8 series. + + * GUILE-VERSION: Bumped version numbers. + + * configure.in: Removed --enable-arrays option. + +2005-12-14 Neil Jerram + + * NEWS: Remove entry claiming that breakpoints have been added, + because breakpoints are now implemented outside the core distro. + Add entries on obsolescence of the 'cheap option and on tweaking + support in evaluator trap calls. Finally, correct outline level + of item about make-keyword-from-dash-symbol. + +2005-07-09 Neil Jerram + + * configure.in (AC_CONFIG_FILES): Removed emacs/Makefile and + ice-9/debugger/breakpoints/Makefile. + + * Makefile.am (SUBDIRS): Removed emacs. + +2005-06-05 Marius Vollmer + + From Jan Nieuwenhuizen . Thanks! + + * configure.in: Add tests for socklen_t and ip_mreq. + +2005-03-13 Kevin Ryde + + * configure.in, GUILE-VERSION (LIBGUILE_SRFI_SRFI_60): New defines. + +2005-03-09 Marius Vollmer + + Guile 1.7.2 has been released. + + * GUILE-VERSION (GUILE_MICRO_VERSION): Incremented to "2". + +2005-03-08 Marius Vollmer + + libltdl is no longer distributed. We expect it to be installed + already. + + * configure.in: Do not call AC_LIBLTDL_INSTALLABLE. Use + AC_CHECK_LIB instead. Do not subst LTDLINCL and LIBLTDL. Do not + add "-DLIBLTDL_DLL_IMPORT" on MINGW32. + + * Makefile.am (SUBDIRS): Removed libltdl. + + * README: Talk about required external packages. + + * autogen.sh: Do not call libtoolize. + +2005-03-02 Marius Vollmer + + * configure.in: Do not check for fast or recursive mutexes. Check + for pthread_attr_getstack. + (SCM_I_GSC_USE_COOP_THREADS): Dot not subst. + (pthread_mutexattr_settype): Do not check for it. + +2005-02-28 Marius Vollmer + + * autogen.sh: Add '--verbose' option to autoreconf invocation. + Thanks to Bruno Haible. + +2005-01-02 Marius Vollmer + + * configure.in (SCM_I_GSC_HAVE_ARRAYS): Removed '--disable-arrays' + option. + +2004-11-28 Kevin Ryde + + * configure.in (AC_SUBST): Correction, LTDLINC should be LTDLINCL, the + latter is what libtool defines. + +2004-10-27 Marius Vollmer + + * libguile.h: Include "libguile/srfi-4.h". + +2004-10-25 Marius Vollmer + + * autogen.sh: Added explicit invocation of libtoolize before + autoreconf so that libltdl/ is updated as well. + +2004-10-22 Marius Vollmer + + Removed usage of libguile-ltdl. + + * configure.in: Call AC_LIBLTDL_INSTALLABLE instead of + AC_LIB_LTDL. + (AC_CONFIG_SUBDIRS): Added libltdl. + (DLPREOPEN, LTDLINC, LIBLTDL): Moved AC_SUBST near other libtool + stuff. Also subst LTDLINC instead of INCLTDL. + (AC_CONFIG_FILES): Removed libguile-ltdl/Makefile and + libguile-ltdl/upstream/Makefile. + + * Makefile.am (SUBDIRS): Replaced libguile-ltdl with libltdl. + +2004-09-28 Marius Vollmer + + * ABOUT-NLS: New, from gettext 0.14.1. + + * configure.in: Do use AM_GNU_GETTEXT, since gettextize is not run + with autoconf 2.59. + +2004-09-25 Marius Vollmer + + * configure.in: Do not use AM_GNU_GETTEXT for now, it causes + gettextize to run during autogen.sh, which we do not want. + Explicitely check for libintl, gettext, bindtextdomain, and + textdomain instead. + +2004-09-24 Marius Vollmer + + * libguile.h: Include outside of extern "C" block. + (Note that numbers.h still includes gmp.h to make it + self-contained.) + + * configure.in: Do not include PTHREAD_CFLAGS in CFLAGS, CFLAGS is + for the user and is often overwritten temporarily. + (GUILE_CFLAGS): New, include PTHREAD_CFLAGS here. + (GUILE_LIBS): Remove THREAD_LIBS_INSTALLED, which is unused now. + +2004-09-22 Marius Vollmer + + * configure.in: Add AM_GNU_GETTEXT invocation. From Bruno Haible. + +2004-09-21 Marius Vollmer + + * acinclude.m4 (ACX_PTHREAD): New. + * configure.in: Use it instead of simply looking for -lpthread. + Thanks to Andreas Vögele! + +2004-09-08 Marius Vollmer + + * configure.in: Fail when alloca can not be found natively. + +2004-09-03 Stefan Jahn + + * configure.in (isinf): Let configure find the isinf() function + on MinGW32 systems. + +2004-08-27 Kevin Ryde + + * configure.in (AC_CHECK_MEMBERS): Add struct sockaddr.sin_len and + struct sockaddr_in6.sin6_len. Reported by Michael Tuexen. + +2004-08-27 Marius Vollmer + + Guile 1.7.1 as been released. + +2004-08-26 Marius Vollmer + + * GUILE-VERSION: Bumped all versions for the 1.7.1 release. Added + LIBGUILE_*_MAJOR variables for inclusion in the names of shared + libraries such as "libguile-srfi-srfi-1-v-MAJOR.la". Removed + LIBQTHREADS_*. + * configure.in: Updated for the new set of variables defined in + GUILE-VERSION. + +2004-08-25 Marius Vollmer + + * libguile.h: Include srfi-13.h and srfi-14.h, do not include + strop.h. + +2004-08-02 Marius Vollmer + + * README: Document the new --disable-discouraged option. + + * configure.in (SCM_I_GSC_ENABLE_DISCOURAGED): New, for the new + --enable-discouraged option. + + * libguile.h: Include libguile/discouraged.h. + +2004-07-29 Marius Vollmer + + * configure.in: Bugfix: logic in detecting ptrdiff_t was inverted; + assume ptrdiff_t is available when its size is non-zero, not when + it is zero. Do no longer define SCM_I_GSC_*_LIMITS macros. Check + for sizes of size_t and intmax_t. + +2004-07-09 Marius Vollmer + + * configure.in: Bugfix: set SCM_I_GSC_T_UINTMAX, not + SCM_I_GSC_T_INTMAX in two places. Thanks to Andreas Vögele! + +2004-07-07 Marius Vollmer + + * configure.in: When checking for suitable types for scm_t_int8, + etc, try int8_t first, so that we pick them up when they are + defined. Also, substitute limit macros like INT8_MIN into the + configure header for all these types. + +2004-07-05 Kevin Ryde + + * configure.in (isinf, isnan): Detect macro versions as well as + functions, since C99 specifies them as macros and that's all HP-UX + has. Reported by Andreas Voegele. + +2004-06-28 Marius Vollmer + + * configure.in: Removed code for --enable-htmldoc; support for + HTML is now included in automake. + +2004-06-16 Rob Browning + + * pre-inst-guile.in: modify to handle move of readline.scm to + ice-9 subdir of guile-readline. + + * pre-inst-guile-env.in: modify to handle move of readline.scm to + ice-9 subdir of guile-readline. + + * configure.in: move package and version args to AC_INIT as is now + recommended. This also requires m4_esyscmd to read GUILE-VERSION + given the way AC_INIT handles its args. + +2004-04-22 Kevin Ryde + + * configure.in (AC_CHECK_HEADERS): Add fenv.h. + (AC_CHECK_FUNCS): Add fesetround. + +2004-04-18 Kevin Ryde + + * configure.in (AC_CHECK_FUNCS): Add readdir_r. + +2004-03-23 Kevin Ryde + + * configure.in (AC_CHECK_FUNCS): Add sysconf. + (AC_CHECK_HEADERS): Add netdb.h and sys/param.h. + +2004-03-21 Kevin Ryde + + * configure.in (AC_CHECK_FUNCS): Add gmtime_r. + +2004-03-14 Kevin Ryde + + * configure.in (strptime): Use #define _GNU_SOURCE to get the + prototype from glibc, use AC_CHECK_DECLS rather than AC_EGREP_HEADER. + +2004-02-29 Kevin Ryde + + * configure.in: Use AC_COPYRIGHT and AH_TOP to get copyright notice + into generated configure and config.h.in. + + * configure.in (AC_CHECK_FUNCS): Add DINFINITY and DQNAN. + +2004-02-21 Kevin Ryde + + * configure.in (crypt): Test with AC_SEARCH_LIBS, for the benefit of + HP-UX. Define HAVE_CRYPT rather than HAVE_LIBCRYPT. Reported by + Andreas Voegele. + +2004-02-18 Kevin Ryde + + * configure.in (AC_CHECK_HEADERS): Add crt_externs.h. + (AC_CHECK_FUNCS): Add _NSGetEnviron. + +2004-02-15 Mikael Djurfeldt + + * configure.in: Use AC_PROG_LIBTOOL instead of AM_PROG_LIBTOOL. + +2004-01-25 Neil Jerram + + * configure.in (GUILE_FUNC_DECLARED), acinclude.m4 + (GUILE_STRUCT_UTIMBUF, GUILE_NAMED_CHECK_FUNC): Correctly quote + macros being defined. + +2003-12-26 Marius Vollmer + + * configure.in: Find a suitable type for the new scm_t_intmax and + scm_t_uintmax. + +2003-11-17 Rob Browning + + * configure.in: rewrite ALLOCA related code as multiple lines so + it doesn't break with current autoconf substitutions. + +2003-11-15 Kevin Ryde + + * configure.in (--with-guile-for-build): Remove this option, it's not + normal style for --with. + (GUILE_FOR_BUILD): Use AC_ARG_VAR. + * README (Cross building Guile): Describe GUILE_FOR_BUILD rather than + --with-guile-for-build. + +2003-11-11 Neil Jerram + + * .cvsignore: Add elisp-comp. + +2003-10-30 Neil Jerram + + * configure.in (AC_CONFIG_FILES): Add `emacs/Makefile'. + (AM_PATH_LISPDIR): Added. + + * Makefile.am (SUBDIRS): Add `emacs'. + +2003-07-27 Marius Vollmer + + * configure.in: Look for sched_yield in -lrt; this is needed for + Solaris. Thanks to Matthias Koeppe! + (setgroups): Check for it. + + * configure.in (__libc_stack_end): Actually use the value in + __libc_stack_end for something so that the access doesn't get + optimized away. Thanks to Matthias Koeppe! + +2003-07-08 Kevin Ryde + + * configure.in (AC_CHECK_FUNCS): Add sincos. + +2003-06-21 Kevin Ryde + + * configure.in (AC_CHECK_FUNCS): Add asinh, acosh, atanh and trunc. + +2003-06-19 Marius Vollmer + + * configure.in: use "-Werror" only with GCC. Thanks to Matthias + Koeppe! + +2003-06-19 Kevin Ryde + + * README (Guile Documentation): Update to manuals now available, + remove notes about the reference manual being in progress. + +2003-06-14 Stefan Jahn + + * configure.in: Checking for __int64 as possible candidate for + the SCM_I_GSC_T_INT64 define. + +2003-05-30 Stefan Jahn + + * configure.in: Checking for unsetenv(). + +2003-05-29 Stefan Jahn + + * configure.in: Removed -lm check and added a cached check for + __libc_stack_end to get it building for mingw32 hosts. + +2003-05-19 Kevin Ryde + + * README (Cross building Guile): Remove --with-cc-for-build in favour + of CC_FOR_BUILD. + +2003-05-16 Kevin Ryde + + * configure.in (--with-cc-for-build): Remove this option, CC_FOR_BUILD + variable is more or less standard, and is adequate for the task. + +2003-05-12 Kevin Ryde + + * configure.in (CC_FOR_BUILD): Use AC_ARG_VAR. + + * configure.in (SCM_SINGLES): Use AC_CHECK_SIZEOF(float), to + eliminate guess-yes when cross compiling. + + * configure.in (SCM_I_GSC_STACK_GROWS_UP): Fix missing comma in + AC_TRY_RUN. + +2003-04-20 Dirk Herrmann + + * libguile.h: Removed uses of DEBUG_EXTENSIONS to fix compile + errors with --disable-deprecated. + +2003-04-07 Rob Browning + + * pre-inst-guile-env.in: new script -- can be used to run commands + in an envt set up using the development libs, Guile, etc. + + * configure.in: handle pre-inst-guile-env and add + test-suite/standalone/Makefile. + +2003-04-06 Marius Vollmer + + * configure.in: Check for mpz_import, which is required but only + available in GMP 4.1. + +2003-04-05 Marius Vollmer + + * Changed license terms to the plain LGPL thru-out. + +2003-04-04 Rob Browning + + * configure.in: add GMP test (require GMP). + +2003-03-26 Marius Vollmer + + * libguile.h: Include "libguile/deprecated.h". + +2003-03-25 Rob Browning + + * configure.in: big overhaul to shift us to have separate private, + config.h, and public, scmconfig.h, configuration headers. Added a + fair amount of code to track down new required types: scm_t_uint8, + scm_t_uint16, scm_t_uint32, scm_t_int8, scm_t_int16, scm_t_int32, + and to detect optional types scm_t_uint64, scm_t_in64, long long, + unsigned long long, scm_t_ptrdiff, intptr_t, and uintptr_t. + (SCM_I_GSC_T_PTRDIFF): gen-scmconfig.h.in AC_SUBST var. + (SCM_I_GSC_NEEDS_INTTYPES_H): gen-scmconfig.h.in AC_SUBST var. + (SCM_I_GSC_NEEDS_STDINT_H): gen-scmconfig.h.in AC_SUBST var. + (SCM_I_GSC_T_UINT8): gen-scmconfig.h.in AC_SUBST var. + (SCM_I_GSC_T_UINT16): gen-scmconfig.h.in AC_SUBST var. + (SCM_I_GSC_T_UINT32): gen-scmconfig.h.in AC_SUBST var. + (SCM_I_GSC_T_UINT64): gen-scmconfig.h.in AC_SUBST var. + (SCM_I_GSC_T_INT8): gen-scmconfig.h.in AC_SUBST var. + (SCM_I_GSC_T_INT16): gen-scmconfig.h.in AC_SUBST var. + (SCM_I_GSC_T_INT32): gen-scmconfig.h.in AC_SUBST var. + (SCM_I_GSC_T_INT64): gen-scmconfig.h.in AC_SUBST var. + (USE_PTHREAD_THREADS): removed - handled by gen-scmconfig.c. + (USE_NULL_THREADS): removed - handled by gen-scmconfig.c. + (USE_COOP_THREADS): removed - handled by gen-scmconfig.c. + (SCM_I_GSC_USE_PTHREAD_THREADS): gen-scmconfig.h.in AC_SUBST var. + (SCM_I_GSC_USE_NULL_THREADS): gen-scmconfig.h.in AC_SUBST var. + (SCM_I_GSC_USE_COOP_THREADS): gen-scmconfig.h.in AC_SUBST var. + (STACK_GROWS_UP): removed - handled by gen-scmconfig.c. + (SCM_I_GSC_STACK_GROWS_UP): gen-scmconfig.h.in AC_SUBST var. + (GUILE_DEBUG_FREELIST): removed - handled by gen-scmconfig.c. + (SCM_I_GSC_GUILE_DEBUG_FREELIST): gen-scmconfig.h.in AC_SUBST var. + (GUILE_DEBUG): removed - handled by gen-scmconfig.c. + (SCM_I_GSC_GUILE_DEBUG): gen-scmconfig.h.in AC_SUBST var. + (SCM_ENABLE_DEPRECATED): removed - handled by gen-scmconfig.c. + (SCM_I_GSC_ENABLE_DEPRECATED): gen-scmconfig.h.in AC_SUBST var. + (HAVE_ARRAYS): removed - handled by gen-scmconfig.c. + (SCM_I_GSC_HAVE_ARRAYS): gen-scmconfig.h.in AC_SUBST var. + (SCM_ENABLE_ELISP): removed - handled by gen-scmconfig.c. + (SCM_I_GSC_ENABLE_ELISP): gen-scmconfig.h.in AC_SUBST var. + (SCM_I_GSC_C_INLINE): gen-scmconfig.h.in AC_SUBST var. + (DEBUG_EXTENSIONS): removed - handled by gen-scmconfig.c. + (READER_EXTENSIONS): removed - handled by gen-scmconfig.c. + (USE_THREADS): removed - handled by gen-scmconfig.c. + (GUILE_ISELECT): removed - handled by gen-scmconfig.c. + (DYNAMIC_LINKING): removed - handled by gen-scmconfig.c. + + * README: merge information from INSTALL and remove at least some + of the stale bits. + + * LICENSE: new file -- we should change this to the LGPL soon and + add COPYING.LIB to the distribution. + + * autogen.sh: call autoreconf with --force. This may fix the + "order" problem below without having to have two calls. + + * INSTALL: use the automake installed INSTALL file. The Guile + specific instructions are now in README. + +2003-03-21 Marius Vollmer + + * autogen.sh: Invoke autoreconf twice since the required files do + not seem to be generated in the right order. XXX - investigate + further. + +2003-03-19 Marius Vollmer + + * guile-tools.in (guileversion): Use $GUILE_EFFECTIVE_VERSION + instead of $GUILE_VERSION. Thanks to Kevin Ryde! + +2003-02-27 Rob Browning + + * configure.in (AC_CONFIG_SRCDIR): use GUILE-VERSION. + (AM_CONFIG_HEADER): change to config.h + + * Makefile.am (EXTRA_DIST): remove $(ACLOCAL). + (ACLOCAL_AMFLAGS): replaces ACLOCAL. + + * autogen.sh: switch to autoreconf -- see how it goes. remove + call to guile-aclocal.sh -- we now do the same thing with an + automake setting. + + * guile-aclocal.sh: deleted in favor of ACLOCAL_AMFLAGS in + Makefile.am. + +2003-02-26 Rob Browning + + * configure.in: change our config header from libguile/scmconfig.h + to be the traditional ./config.h. libguile/scmconfig.h is now + built from that during the build process. More changes coming... + +2003-01-23 Mikael Djurfeldt + + * libguile.h: #include "futures.h" + +2002-12-16 Mikael Djurfeldt + + * configure.in: Test if pthread.h declares + pthread_mutexattr_settype (). + +2002-12-15 Mikael Djurfeldt + + * configure.in (SCM_MUTEX_FAST, SCM_MUTEX_RECURSIVE): Test for + ways to get fast and recursive mutexes. + +2002-12-10 Mikael Djurfeldt + + * configure.in (_THREAD_SAFE): Define when pthreads are enabled in + order to get thread safe versions of glibc functions. + +2002-12-09 Mikael Djurfeldt + + * configure.in: Temporarily replaced "copt" threads option with new + option "pthreads". + (USE_PTHREAD_THREADS): Define if pthreads configured. + +2002-12-08 Rob Browning + + * configure.in (GUILE_EFFECTIVE_VERSION): AC_SUBST it. + (AC_CONFIG_FILES): separate out the files that need to be chmodded + at the end of config.status. Our "default" approach using + AC_CONFIG_COMMANDS quit working (and would have needed to be + changed to AC_CONFIG_COMMANDS(,,CMDS) rather than our previous + AC_CONFIG_COMMANDS(default,CMDS), but I the new approach, using + per-file AC_CONFIG_FILES calls appears to be more "correct" in the + current autoconf docs. + + * GUILE-VERSION (GUILE_EFFECTIVE_VERSION): new variable. + +2002-12-02 Marius Vollmer + + * Makefile.am (SUBDIRS): Removed qt. + + * configure.in: Do not configure QTHREADS. Do not define + USE_COOP_THREADS. Changed logic for thread package selection so + that the default is "coop-pthread" when -lpthread is found, "null" + otherwise. + +2002-12-01 Mikael Djurfeldt + + * GUILE-VERSION: Added versioning info for srfi 1. + + * configure.in (LIBGUILE_SRFI_SRFI_1_INTERFACE_CURRENT, + LIBGUILE_SRFI_SRFI_1_INTERFACE_REVISION, + LIBGUILE_SRFI_SRFI_1_INTERFACE_AGE, + LIBGUILE_SRFI_SRFI_1_INTERFACE): New AC_SUBST. + +2002-11-10 Marius Vollmer + + * configure.in (USE_THREADS, GUILE_ISELECT): Define always. We + define them with AC_DEFINE and not in some header file so that + they are visible exactly in the same way as they used to be. + +2002-11-03 Marius Vollmer + + * configure.in: Do not add "threads.o" to the libobjs, it is now + always compiled. + (USE_THREADS, GUILE_ISELECT): Do not define. + +2002-10-27 Marius Vollmer + + * configure.in: Handle thread package "coop-pthread" with alias + "copt" and define USE_COPT_THREADS when it is selected. + Always define GUILE_ISELECT. + +2002-10-26 Neil Jerram + + * configure.in (AC_CONFIG_FILES): Add ice-9/debugger/Makefile and + ice-9/debugger/breakpoints/Makefile. + +2002-10-21 Marius Vollmer + + * configure.in: Changed logic in thread support configuration such + that --with-threads=no is equivalent to --with-threads=null. On + platforms that are not supported by QuickThreads, we also use the + null-threads. Thus, USE_THREADS is always defined now. + +2002-10-16 Marius Vollmer + + * configure.in: Shuffled around and extended the thread + configuration code to allow the "null" thread package to be + selected. Define USE_NULL_THREADS in that case. + +2002-10-13 Gary Houston + + * autogen.sh (ac_version): try automake 1.7 too. + +2002-10-05 Marius Vollmer + + * autogen.sh: Make sure that $autoheader is always set. When we + would use the plain "autoconf", $autoheader would end up empty and + libguile/scmconfig.h.in would not be updated. + +2002-10-04 Rob Browning + + * libltdl: moved to libguile-ltdl. + + * Makefile.am (SUBDIRS): remove libltdl. + + * autogen.sh: remove support for libltdl sub-configure. + (ac_version): widen support check to any 2.5? autoconf version. + 2.54 is out now. + + * configure.in: turn on -Werror by default. We're now clean. I'd + like to stay that way. If we want, we can turn it off by default + when we make the stable release, but I caught a lot of bugs this + way. Accomodate libguile-ltdl -- therea are some ltdl things that + are commented out now INCLTDL and LIBLTDL. I think we may not + need them anymore, but I'll leave them until we're sure. We also + killed off the libltdl dir and related options including the + AC_CONFIG_SUBDIRS. I also added some explicit tests for some + headers and functions that weren't listed but were in + scmconfig.h.in. though this may have been unnecessary. + +2002-10-04 Marius Vollmer + + * configure.in: Use AC_LIBLTDL_CONVENIENCE instead of + AC_LIBLTDL_INSTALLABLE. + +2002-10-03 Marius Vollmer + + * autogen.sh: Do not instruct libtoolize to copy libltdl into our + sources. Do not patch it. We have our own version now that is + only being used as a convenience library. + +2002-08-24 Marius Vollmer + + * configure.in: Check for __libc_stack_end. + +2002-08-05 Han-Wen Nienhuys + + * configure.in: add snprintf + +2002-08-04 Han-Wen + + * NEWS: add entries for GC and vector WB. + +2002-07-22 Han-Wen + + * autogen.sh (mscripts): find and check version number of + automake. Complain if 1.6 is not found. + +2002-07-20 Han-Wen + + * autogen.sh (mscripts): find and check version number of + autoconf. Complain if 2.53 is not found. + +2002-07-20 Dirk Herrmann + + * benchmark-guile.in: Copied from check-guile.in and adapted for + use with benchmarks. + + * Makefile.am: Recurse into the benchmark-suite subdir. + + * configure.in: Added benchmarking files. + +2002-07-12 Gary Houston + + * configure.in: check dynamic linking before modules. Add dynl.c + if dynamic linking is available, i.e., unless --with-modules=no + was given to configure. + +2002-07-09 Marius Vollmer + + * autogen.sh: Patch libltdl/ltdl.c to avoid a nasty bug in + libtool-1.4.2. + +2002-07-07 Marius Vollmer + + * autogen.sh: Do not copy INSTALL from workbook since it is not + uniform across branches. + * INSTALL: Re-added to repository. + + Crosscompiling and Cygwin fixes from Jan Nieuwenhuizen. Thanks! + + * autogen.sh: Only fix libltdl/configure.in if it exists. Current + libtool CVS does not need this fix. + + * configure.in (AC_LIBTOOL_WIN32_DLL): Add for shared Cygwin + build. + Add --with-cc-for-build option to re-enable cross building. + Add --with-guile-for-build option to re-enable cross building. + +2002-06-30 Gary Houston + + * autogen.sh: Changed the path to the scripts directory. + In libltdl, run aclocal before autoconf and automake: this + eliminated various warnings after upgrading to newer automake. + +2002-05-22 Marius Vollmer + + From John W. Eaton + + * configure.in (AC_CHECK_FUNCS): Check for copysign. + +2002-05-10 Marius Vollmer + + * libguile.h: Added inclusion of "extensions.h". + +2002-05-06 Marius Vollmer + + * configure.in: Include before when + checking vor IPv6. This is for NetBSD 1.5. Thanks to Greg + Troxel! + + From John W. Eaton. + + * configure.in (AC_CHECK_HEADERS): Check for floatingpoint.h + ieeefp.h, and nan.h. + (AC_CHECK_FUNCS): Check for finite, isinf, and isnan. + +2002-05-01 Thien-Thi Nguyen + + * autogen.sh: Add call to $mscripts/render-bugs + to create BUGS file. + + * BUGS: bye bye + +2002-04-27 Thien-Thi Nguyen + + * Makefile.am (EXTRA_DIST): Remove qthreads.m4. + +2002-04-26 Marius Vollmer + + * guile-aclocal.sh: Replaced with a simple invocation of "aclocal + -I guile-config". This works as of automake 1.5. + * qthreads.m4: Moved to guile-config/. + +2002-04-18 Marius Vollmer + + * autogen.sh: Call automake twice for guile-core so that two + copies of mdate-sh get a chance of being installed (one in + doc/ref/ and one in doc/tutorial/). + +2002-04-16 Marius Vollmer + + * Makefile.am (AUTOMAKE_OPTIONS): New, to request version 1.5. + (EXTRA_DIST): Don't distribute acconfig.h, which is gone. + (dist-hook): Removed. + (DISTCLEANFILES): Added check-guile.log. + (EXTRA_DIST): Don't distribute TODO. + + * configure.in: Bump required autoconf version to 2.53. Move uses + of AC_LIBOBJ after AC_PROG_CC. AC_LIBOBJ needs OBJEXT which is + set by AC_PROG_CC. + +2002-04-10 Rob Browning + + * configure.in: updates for new autoconf -- add definitions to + AC_DEFINE calls, and convert occurences of LIBOBJS to AC_LIBOBJ + calls. + + * acinclude.m4: add definitions to AC_DEFINE calls for new + autoconf. + + * acconfig.h: removed -- newer autoconf doesn't like it, and now + we don't need it. + + * .cvsignore: add autom4te.cache and pre-inst-guile. + +2002-04-03 Thien-Thi Nguyen + + * RELEASE: bye bye + +2002-03-31 Thien-Thi Nguyen + + * Makefile.am: Update copyright. + (dist-hook): Add, including related am/maintainers-dirs, + surrounded by "if MAINTAINER_MODE". + + * TODO: bye bye + + * autogen.sh: Add usage comment. + Add workbook specification. + Add dist-files symlinking. + + * ANON-CVS, HACKING, INSTALL, SNAPSHOTS: bye bye + +2002-03-06 Thien-Thi Nguyen + + * guile-tools.in: Handle "--source" option. + +2002-03-04 Thien-Thi Nguyen + + * configure.in (top_srcdir_absolute): New AC_SUBST var. + + * pre-inst-guile.in, check-guile.in (top_srcdir): + Use `top_srcdir_absolute' AC_SUBST var. + + * pre-inst-guile.in (top_srcdir): Fix ref bug: Force absolute. + +2002-02-27 Thien-Thi Nguyen + + * pre-inst-guile.in: Typofix; nfc. + +2002-02-27 Stefan Jahn + + * Makefile.am (SUBDIRS): Added the `am' directory. + +2002-02-26 Thien-Thi Nguyen + + * pre-inst-guile.in: New file. + + * pre-inst-guile, pre-inst-guile.am: bye bye + + * configure.in (top_builddir_absolute): New AC_SUBST var. + (AC_CONFIG_FILES): Add am/Makefile, pre-inst-guile. + (AC_CONFIG_COMMANDS): Also chmod +x pre-inst-guile. + + * check-guile.in (top_builddir): Use AC_SUBST var + `top_builddir_absolute'. + (guile): Look for pre-inst-guile in $top_builddir. + + * Makefile.am (EXTRA_DIST): Remove pre-inst-guile, + pre-inst-guile.am. + +2002-02-24 Rob Browning + + * GUILE-VERSION: move all but guile-readline library versioning + information here. guile-readline is still standalone. Bump + CURRENT interfaces to 15 to allow some headroom for 1.6 release at + Thi-Thien's request. + + * configure.in: AC_SUBST the centralized shared lib versioning + variables from ./GUILE-VERSION. + (LIBQTHREADS_INTERFACE_CURRENT): new AC_SUBST. + (LIBQTHREADS_INTERFACE_REVISION): new AC_SUBST. + (LIBQTHREADS_INTERFACE_AGE): new AC_SUBST. + (LIBQTHREADS_INTERFACE): new AC_SUBST. + (LIBGUILE_INTERFACE_CURRENT): new AC_SUBST. + (LIBGUILE_INTERFACE_REVISION): new AC_SUBST. + (LIBGUILE_INTERFACE_AGE): new AC_SUBST. + (LIBGUILE_INTERFACE): new AC_SUBST. + (LIBGUILE_SRFI_SRFI_4_INTERFACE_CURRENT): new AC_SUBST. + (LIBGUILE_SRFI_SRFI_4_INTERFACE_REVISION): new AC_SUBST. + (LIBGUILE_SRFI_SRFI_4_INTERFACE_AGE): new AC_SUBST. + (LIBGUILE_SRFI_SRFI_4_INTERFACE): new AC_SUBST. + (LIBGUILE_SRFI_SRFI_13_14_INTERFACE_CURRENT): new AC_SUBST. + (LIBGUILE_SRFI_SRFI_13_14_INTERFACE_REVISION): new AC_SUBST. + (LIBGUILE_SRFI_SRFI_13_14_INTERFACE_AGE): new AC_SUBST. + (LIBGUILE_SRFI_SRFI_13_14_INTERFACE): new AC_SUBST. + + * autogen.sh: make absolutely sure we can't have stale files from + old versions lying around the libltdl dir since libtoolize + doesn't. Also hack libltdl's configure.in to require autoconf 2.5 + so the main tree and libltdl can't get out of sync again. + + * RELEASE: update release building instructions. + +2002-02-21 Neil Jerram + + * acinclude.m4 (GUILE_HEADER_LIBC_WITH_UNISTD): Use [] rather than + "" for multiword string. Thanks to Christopher Cramer for + pointing this out. + +2002-02-11 Marius Vollmer + + * acconfig.h (GUILE_DEBUG_MALLOC): Refer to scm_gc_malloc, etc, + instead of to scm_must_malloc. + +2002-02-07 Marius Vollmer + + * Makefile.am (EXTRA_DIST): Added pre-inst-guile and + pre-inst-guile.am. + +2002-02-05 Thien-Thi Nguyen + + * pre-inst-guile.am, pre-inst-guile: New files. + + * check-guile.in (srcdir): Delete var. + (top_builddir, top_srcdir, guile_opts): New vars. + + Use "set -e". + No longer set LTDL_LIBRARY_PATH. + Use ${top_srcdir}/pre-inst-guile instead of libguile/guile. + + * configure.in (libguile/guile-snarf-docs-texi): Remove + from `AC_CONFIG_FILES' and `AC_CONFIG_COMMANDS'. + + * check-guile.in (top_builddir): Fix bug: Use cwd. + (TEST_SUITE_DIR): Fix bug: Use `top_srcdir'. + (GUILE_LOAD_PATH): No longer include $top_srcdir. + + * pre-inst-guile: Fix bug: Use ":" in `case' pattern to prevent + prefix aliasing. + +2002-01-31 Stefan Jahn + + * configure.in: Add -DLIBLTDL_DLL_IMPORT to INCLTDL when using + `libltdl.dll'. + +2002-01-28 Stefan Jahn + + * configure.in (guile_cv_have_uint32_t): Look also in + `stdint.h' for uint32_t. + +2002-01-13 Neil Jerram + + * Makefile.am (SUBDIRS): Added lang. + + * configure.in (AC_CONFIG_FILES): Added Makefiles in lang, + lang/elisp, lang/elisp/internals and lang/elisp/primitives. + +2002-01-11 Neil Jerram + + * acconfig.h (SCM_ENABLE_ELISP): New conditional. + + * configure.in (SCM_ENABLE_ELISP): Define this conditional (or + not) according to absence (or presence) of `--disable-elisp' + in the configure args. + +2001-12-31 Dirk Herrmann + + * TODO: Added two items. + +2001-12-26 Marius Vollmer + + * configure.in (HAVE_MAKEINFO): Check for the makeinfo program and + set this conditional accordingly. + +2001-12-01 Thien-Thi Nguyen + + * README: Fix virulent typo. + +2001-11-25 Marius Vollmer + + * acconfig.h (HAVE_INLINE): Added template. + * configure.in (HAVE_INLINE): Define it when the compiler supports + inline functions. + + * libguile.h: Include "libguile/inline.h". + +2001-11-22 Gary Houston + + * HACKING: Modified the Hacking It Yourself section. Removed the + version numbers from the tools. + HACKING, README, ANON-CVS: updates. + +2001-11-21 Gary Houston + + * HACKING: Removed reference to no longer practiced * in ChangeLog + convention. + +2001-11-19 Thien-Thi Nguyen + + * BUGS (11): Set "fixed: no-need". + + * TODO (write emacs/patch.el): New item, self-assigned. + +2001-11-19 Rob Browning + + * configure.in: switch to AC_LIBLTDL_INSTALLABLE so we'll use the + system libltdl when it's available. Aside from the normal reasons + to prefer installed shared libs, this means other apps that link + with libguile and also use libltdl will be more likely to work + right. + +2001-11-17 Dirk Herrmann + + * BUGS (4): Set "fixed: 2001-11-17 (1.7.x)". + +2001-11-15 Thien-Thi Nguyen + + * guile-tools.in: Handle command "list" specially: list scripts dir. + + (help): Make more informative. + +2001-11-12 Marius Vollmer + + * autogen.sh: Recurse into libltdl directory and invoke autoconf + there. + +2001-11-11 Thien-Thi Nguyen + + * HACKING: Restrict documentation change log + waiver to only apply to ChangeLog files. + +2001-11-12 Marius Vollmer + + * configure.in: Check for sizes of short, size_t, uintptr_t, and + ptrdiff_t. Checking for a size also checks automatically for the + existence of the type, so we don't check for the existence of + uintptr_t, ptrdiff_t and long long ourselves. + +2001-11-10 Thien-Thi Nguyen + + * BUGS (11): New. + +2001-11-07 Stefan Jahn + + * configure.in: Include `win32-socket.o' in the list of object + files if networking is enabled on Win32. + +2001-11-06 Thien-Thi Nguyen + + * TODO (sync srfi-modules.texi): New, done. + + * BUGS (9, 10): New. + +2001-11-04 Stefan Jahn + + * NEWS: Corrected remarks about SCM_API. + + * configure.in: Defining USE_DLL_IMPORT definition to indicate + usage of DLL import macros in `libguile/__scm.h'. + (LIBOBJS): Removed `fileblocks.o' from the list of object files. + Somehow Jim Blandy's patch from 1997 did not survive. + +2001-11-02 Marius Vollmer + + Support for native Win32. Thanks to Stefan Jahn! + + * check-guile.in: Replaced `ln -s' by `@LN_S@' to supports + build systems which do not have symbolic links. + * configure.in: Define AC_LIBTOOL_WIN32_DLL to build clean dlls + on Win32 platforms. + Checking for `ws2_32.dll', `winsock2.h', add `win32-uname.o' + and `win32-dirent.o' and define extra compiler flags necessary + to build clean dlls. + Check for `regcomp()' inside `-lregex'. + +2001-10-26 Thien-Thi Nguyen + + * BUGS (7, 8): New. + +2001-10-25 Thien-Thi Nguyen + + * BUGS: Expand on file format description. + + (1): Update "fixed" field. + (2, 3, 4, 5, 6): New. + +2001-10-14 Gary Houston + + * configure.in: include sys/types.h when testing uint32_t. + thanks to Bill Schottstaedt. + +2001-10-14 Marius Vollmer + + * configure.in: Do not use an absolute path for when + checking for return type of usleep. Thanks to Michael Carmack. + +2001-09-30 Thien-Thi Nguyen + + * BUGS: New file. + * Makefile.am (EXTRA_DIST): Add BUGS file. + +2001-09-25 Thien-Thi Nguyen + + * TODO: Add bugfix item to "Eventually". + +2001-09-20 Rob Browning + + * configure.in (AC_CONFIG_FILES): add libguile/version.h. + +2001-09-11 Rob Browning + + * RELEASE: Deleted Ian Grant and Julian Satchell's addresses from + the testing list since they're no longer functional. + +2001-09-04 Thien-Thi Nguyen + + * TODO: + Use outline mode instead of text. + Reword protocol explanation. + Add "make error-signalling functions more consistent" to Eventually. + Move some C-related GOOPS tasks to 1.8.0, take ownership. + +2001-08-31 Thien-Thi Nguyen + + * HACKING (Sample GDB Initialization File): New section. + + * TODO (1.8.0): Add "move .gdbinit" entry. + +2001-08-31 Dirk Herrmann + + * TODO: Added some points, and eliminated all done items. + + * acconfig.h, configure.in (SCM_DEBUG_DEPRECATED, + SCM_ENABLE_DEPRECATED): Renamed SCM_DEBUG_DEPRECATED to + SCM_ENABLE_DEPRECATED with the logic reversed. + +2001-08-31 Dirk Herrmann + + * libguile.h: Removed bogus comment, rearranged includes, removed + deprecated definitions. + + (LIBGUILEH, SCM_LIBGUILE_H): Renamed H to SCM__H. + +2001-08-30 Thien-Thi Nguyen + + * HACKING: Mention libtool ./configure-regeneration requirement. + +2001-08-27 Marius Vollmer + + * check-guile.in: Do not include ".libs" in LTDL_LIBRARY_PATH, + libltdl provides it itself. + +2001-08-24 Neil Jerram + + * configure.in (AC_CONFIG_FILES): Add per-manual doc directory + Makefiles. + +2001-08-15 Rob Browning + + * configure.in + (LIBGUILE_INTERFACE_CURRENT): use libtool versioning scheme. + (LIBGUILE_INTERFACE_REVISION): use libtool versioning scheme. + (LIBGUILE_INTERFACE_AGE): use libtool versioning scheme. + (LIBGUILE_INTERFACE): use libtool versioning scheme. + (LIBGUILEQTHREADS_INTERFACE_CURRENT): use libtool versioning scheme. + (LIBGUILEQTHREADS_INTERFACE_REVISION): use libtool versioning scheme. + (LIBGUILEQTHREADS_INTERFACE_AGE): use libtool versioning scheme. + (LIBGUILEQTHREADS_INTERFACE): use libtool versioning scheme. + + * GUILE-VERSION (GUILE_MINOR_VERSION): bump for new unstable. + (GUILE_MICRO_VERSION): reset for new unstable. + (LIBGUILE_INTERFACE_CURRENT): use libtool versioning scheme. + (LIBGUILE_INTERFACE_REVISION): use libtool versioning scheme. + (LIBGUILE_INTERFACE_AGE): use libtool versioning scheme. + (LIBGUILE_INTERFACE): use libtool versioning scheme. + (LIBGUILEQTHREADS_INTERFACE_CURRENT): use libtool versioning scheme. + (LIBGUILEQTHREADS_INTERFACE_REVISION): use libtool versioning scheme. + (LIBGUILEQTHREADS_INTERFACE_AGE): use libtool versioning scheme. + (LIBGUILEQTHREADS_INTERFACE): use libtool versioning scheme. + +2001-08-07 Marius Vollmer + + * Makefile.am (EXTRA_DIST, SUBDIRS): Move test-suite from + EXTRA_DIST to SUBDIRS. + + * configure.in: Added "test-suite/Makefile". + +2001-08-01 Marius Vollmer + + * configure.in: Added `--disable-linuxthreads' option and do not + define GUILE_PTHREAD_COMPAT nor link with -lpthread when it is + given. Thanks to Cris Cramer! + +2001-07-23 Marius Vollmer + + * Makefile.am (SUBDIRS): Build libguile before ice-9. + +2001-07-22 Marius Vollmer + + * configure.in: Check for "inttypes.h". + +2001-07-19 Rob Browning + + * configure.in: add checks for setitimer and getitimer. + Add --enable-error-on-warning. + +2001-07-18 Martin Grabmueller + + * INSTALL, Makefile.am, configure.in: Updated copyright notice. + +2001-07-15 Thien-Thi Nguyen + + * HACKING: Remove onerous authorship-info deletion clause. + +2001-07-13 Keisuke Nishida + + * autogen.sh: Call libtoolize with --force. + +2001-07-10 Thien-Thi Nguyen + + * INSTALL: Point to HACKING for tool versions. + +2001-07-08 Rob Browning + + * TODO: updated to include relevant itemized post-1.6-RELEASE + tasks that are distributable so we can check them off as they are + done, and delete 1.6.0 tasks. + + * RELEASE: add a note that the RELEASE instructions are out of + date now that we're using branches. + + * AUTHORS: add "many files throughout" for myself. + +2001-06-28 Thien-Thi Nguyen + + * README: Also mention guile-tools. + + * README: Mention libguile-srfi-*, oop/*, scripts/* and srfi/*. + +2001-06-27 Thien-Thi Nguyen + + * RELEASE: Move todo items to file TODO. + + * TODO: Initial revision + + * Makefile.am (EXTRA_DIST): Add TODO. + + * HACKING: Refer to TODO and SNAPSHOTS. + No longer refer to devel/tasks.text. + + * SNAPSHOTS: Fix reference bug; recommended tool + versions are in HACKING. + + * TODO: Add completion and ownership protocol to header comments. + + * RELEASE: Add TODO-processing to spiffing checklist. + + * HACKING: Update deprecation procedure to refer to TODO. + +2001-06-27 Michael Livshin + + * autogen.sh: don't run flex here. + + * HACKING: clarify that newer versions of flex should be just + fine. + +2001-06-26 Martin Grabmueller + + * HACKING, ANON-CVS: Removed mentioning of guile-doc CVS module. + + * configure.in: Added some header and function checks. + +2001-06-25 Neil Jerram + + * autogen.sh: Quoting fix for `--enable-maintainer-mode'. + +2001-06-25 Marius Vollmer + + * autogen.sh: Added message about what to do next. Tell them to + use `--enable-maintainer-mode'. + +2001-06-25 Michael Livshin + + * HACKING: mention flex. + + * autogen.sh: generate libguile/c-tokenize.c. + +2001-06-20 Martin Grabmueller + + * libguile.h: Removed inclusion of libguile/tag.h. + +2001-06-16 Marius Vollmer + + * libguile.h (scm_cond_t, scm_key_t, scm_mutex_t): Only define + these when using threads. + +2001-06-14 Marius Vollmer + + * libguile.h: Added deprecated section with the olde type names. + + * configure.in: Check for header . Check for uintptr_t + type. Use AC_CHECK_TYPES for this. Do not caus ptrdiff_t to be + `#defined'. + + * acconfig.h (ptrdiff_t): Removed. + +2001-06-05 Martin Grabmueller + + * configure.in: Generate examples/box-dynamic-module/Makefile. + +2001-06-03 Marius Vollmer + + * configure.in (AC_CONFIG_FILES, AC_CONFIG_COMMANDS): Add + guile-snarf. + +2001-06-02 Rob Browning + + * configure.in: changes for autoconf 2.50. + (AC_PREREQ): require at least autoconf 2.50. + (AC_INIT): no longer takes an arg. + (AC_CONFIG_SRCDIR): takes arg AC_INIT used to take. + (AC_STRUCT_ST_RDEV): changed -> AC_CHECK_MEMBERS. + (AC_STRUCT_ST_BLKSIZE): deprecated -> AC_CHECK_MEMBERS. + (AC_STRUCT_ST_BLOCKS): use it rather than our version. + (AC_CONFIG_FILES): now generated files go here, not in AC_OUTPUT. + (AC_CONFIG_COMMANDS): now actions go here, not in AC_OUTPUT. + (AC_OUTPUT): no longer takes args. + + * acinclude.m4: AC_LANG not a variable now -- use __cplusplus + unconditionally . + +2001-06-02 Marius Vollmer + + * configure.in: Check for mkstemp via AC_REPLACE_FUNCS. Thanks to + I. N. Golubev! + +2001-06-01 Martin Grabmueller + + * configure.in: Generate examples/box-dynamic/Makefile. + +2001-05-31 Martin Grabmueller + + * Makefile.am (EXTRA_DIST): New subdirectory `examples'. + + * configure.in: Added all Makefiles in the `examples' directory to + AC_OUTPUT. + +2001-05-31 Michael Livshin + + * configure.in: generate guile-snarf-docs & guile-snarf-docs-texi. + don't generate guile-snarf.awk. + + * Makefile.am (EXTRA_DIST): add test-suite. + +2001-05-28 Michael Livshin + + * check-guile.in: fix to be runnable when srcdir!=builddir. + +2001-05-26 Michael Livshin + + revert the controversial part of the 2001-05-23 changes + +2001-05-23 Michael Livshin + + * configure.in: configury for SCM_[U]BITS_T, some more sizeofs. + also, make sure that the integral type choosen to represent an SCM + has exactly the same size as a void pointer. + + * acconfig.h: add undefs for SCM_BITS_T, SCM_UBITS_T, + SCM_SIZEOF_BITS_T, ptrdiff_t. + +2001-05-16 Rob Browning + + * configure.in: add AC_SUBST for GUILE_MICRO_VERSION. + + * GUILE-VERSION + (GUILE_VERSION): now MAJOR.MINOR.MICRO + (GUILE_MICRO_VERSION): new variable, records final revision. + i.e. the 5 in 1.6.5. MINOR_VERSION is now just the middle number, + i.e. the 6. + +2001-05-16 Dirk Herrmann + + * acconfig.h, configure.in: Renamed + GUILE_WARN_DEPRECATED_DEFAULT to SCM_WARN_DEPRECATED_DEFAULT. + +2001-05-15 Marius Vollmer + + * acinclude.m4: Removed copy of "libtool.m4". + +2001-05-14 Dirk Herrmann + + * configure.in (SCM_DEBUG_DEPRECATED): Always defined. + +2001-05-13 Thien-Thi Nguyen + + * AUTHORS (Martin Grabmueller, Thien-Thi Nguyen): Update. + + * HACKING: Update copyright. + Add blurb pointing to devel/tasks.text. + +2001-05-11 Thien-Thi Nguyen + + * check-guile.in: For SRFI testing, set and export env + var `LTDL_LIBRARY_PATH'. + +2001-05-07 Neil Jerram + + * AUTHORS: Add docs-related authorship details. + +2001-05-05 Marius Vollmer + + * configure.in (--enable-deprecated): Recognize "shutup" option + argument and turn it into the default warning level "no". + +2001-05-05 Gary Houston + + * acconfig.h: add HAVE_IPV6. + * configure.in: check whether we can compile with IPv6 support. + +2001-05-04 Thien-Thi Nguyen + + * guile-tools.in: New file. + + * configure.in (AC_OUTPUT): Add guile-tools, and make + executable. + + * Makefile.am (bin_SCRIPTS): New var. + +2001-05-04 Gary Houston + + * configure.in: check whether uint32_t is defined when netdb.h + is included. + acconfig.h: added HAVE_UINT32_T. + +2001-05-02 Marius Vollmer + + * configure.in: Added handling of `--enable-deprecated'. + + * acconfig.h (SCM_DEBUG_DEPRECATED, + GUILE_WARN_DEPRECATED_DEFAULT): Added. + +2001-04-29 Thien-Thi Nguyen + + * Makefile.am (SUBDIRS): Add "scripts". + + * configure.in (AC_OUTPUT): Add scripts/Makefile. + +2001-04-29 Gary Houston + + * libguile.h: include rw.h. + +2001-04-27 Rob Browning + + * GUILE-VERSION (GUILE_MINOR_VERSION): change to 5.0, switching to + the new odd/even ustable/stable version numbering scheme. + (LIBGUILEQTHREADS_MAJOR_VERSION): change to 10 to match Debian and + libguile. In the future, libguile and libguileqthreads may not + stay in sync. This still doesn't appear to affect + libguileqthreads, but we'll fix that next. + +2001-04-25 Martin Grabmueller + + * configure.in: Don't treat srfi directory specially, just create + the Makefile there (thanks to Neil Jerram for the patch). + +2001-04-23 Martin Grabmueller + + * Makefile.am (SUBDIRS): Added `srfi'. + + * configure.in: Added subdirectory `srfi' to build process. + + * libguile.h: Added inclusion of `values.h'. + +2001-04-22 Gary Houston + + * configure.in: check for inet_pton and inet_ntop. + +2001-04-20 Gary Houston + + * acconfig.h: include HAVE_SIN6_SCOPE_ID. + * configure.in: check for sin6_scope_id in sockaddr_in6. + +2001-04-19 Mikael Djurfeldt + + * RELEASE: Added deprecated macro SCM_ARRAY_CONTIGUOUS + +2001-04-17 Gary Houston + + * configure.in: run the autoconf BIGENDIAN check. + +2001-04-12 Niibe Yutaka + + * GUILE-VERSION (LIBGUILEQTHREADS_MAJOR_VERSION, + LIBGUILEQTHREADS_MINOR_VERSION, LIBGUILEQTHREADS_REVISION_VERSION, + LIBGUILEQTHREADS_VERSION): Added libguileqthreads version info. + + * configure.in: Likewise. + +2001-04-11 Keisuke Nishida + + * configure.in (AC_CHECK_FUNCS): Don't check bzero. + (GUILE_FUNC_DECLARED): Removed checking of bzero. + Thanks to NIIBE Yutaka. + +2001-04-10 Mikael Djurfeldt + + * Undeprecated scm_init_oop_goopscore_module. + +2001-03-25 Thien-Thi Nguyen + + * check-guile.in: Fix sh standard conformance bug: Replace + "test -e" with "test -f". Thanks to Alexander Klimov. + +2001-03-19 Gary Houston + + * check-guile.in: rename $parent to $srcdir. if it's equal to "." + set it to `pwd`. + + * check-guile.in: 16 documentation tests were failing if "make + check" was run before Guile had been installed with the current + --prefix. made various changes to the script so that it runs + without a cd to the test-suite directory. For the -i option, + don't point GUILE_LOAD_PATH to the current directory, but let it + use it's own scheme library. + +2001-03-18 Gary Houston + + * check-guile.in: use @srcdir@ instead of @test_suite_dir@. use + the current directory (build dir) not srcdir to find guile + executable. otherwise "make check" doesn't work with a separate + build directory. create the test log in + $build_dir/check-guile.log instead of in srcdir/test-suite + directory. + * configure.in: don't define or substitute test_suite_dir. + +2001-03-17 Gary Houston + + * configure.in: don't append threads.doc to EXTRA_DOT_DOC_FILES, + since EXTRA_DOT_DOC_FILES is redefined later. define + EXTRA_DOT_X_FILES and hand it to AC_SUBST. + +2001-03-09 Martin Grabmueller + + * configure.in: Added header checks for crypt.h, sys/resource.h + and sys/file.h, function checks for chroot, flock, getlogin, + cuserid, getpriority, setpriority, getpass, sethostname, + gethostname, and for crypt() in libcrypt. + +2001-03-09 Neil Jerram + + * configure.in (htmldoc): Merge handling of `--enable-htmldoc' + option from guile-doc/configure.in. + +2001-03-06 Dirk Herrmann + + * libguile.h: Removed #include "libguile/dump.h". + +2001-02-02 Keisuke Nishida + + * libguile.h: Added #include "libguile/dump.h". + +2001-01-29 Mikael Djurfeldt + + * libguile.h: Added #include "libguile/rdelim.h". + +2001-01-26 Dirk Herrmann + + The following patch was sent by Thien-Thi Nguyen. + + * check-guile.in: New file. + + * Makefile.am: Add TESTS rule. + + * configure.in: Add support for "make check". + +2000-11-21 Dirk Herrmann + + * acconfig.h: Removed bogus #ifndef. Thanks to Lars J. Aas. + +2000-10-25 Mikael Djurfeldt + + * GUILE-VERSION (LIBGUILE_MAJOR_VERSION): Incremented major + version number to 10 due to the merge of GOOPS. + + * oop: New directory. + +2000-09-20 Keisuke Nishida + + * libguile.h: #include "libguile/properties.h". + +2000-09-17 Gary Houston + + * configure.in, acconfig.h: remove the GCSE test: it doesn't seem + to be reliable on all platforms. + +2000-08-18 Gary Houston + + * acconfig.h: added BROKEN_GCSE. + * configure.in: check for a gcc GCSE optimisation bug. + +2000-07-31 Gary Houston + + * acconfig.h: added HAVE_H_ERRNO + * configure.in: removed some dnl'd & obsolete cygwin stuff. + added a test for h_errno. + +2000-06-21 Mikael Djurfeldt + + * Guile 1.4 released. + +2000-06-20 Mikael Djurfeldt + + * GUILE-VERSION: Changed to work also when included by a Makefile + (e.g. debian/rules). (Thanks to Karl M. Hegbloom.) + (LIBGUILE_MAJOR_VERSION): Bumped to 9. + (GUILE_MINOR_VERSION): Bumped to 4. + +2000-06-12 Mikael Djurfeldt + + * libguile.h: Removed #include "libguile/kw.h". + + * Makefile.am (ACLOCAL): Define as ./guile-aclocal.sh. + (The rule will cd to $(top_srcdir).) + + * configure.in (EXTRA_DOT_DOC_FILES): Create from LIBOBJS and + substitute it into libguile/Makefile. + + * HACKING: Updated recommended libtool version to be 1.3.5. + + * RELEASE: Say that we should update HACKING to reflect the + versions of the tools we're using rather than README. + +2000-06-02 Mikael Djurfeldt + + * NOTES: Removed. + + * TODO: Moved to devel/. + +2000-06-01 Craig Brozefsky + + * GUILE-VERSION: added defnitions for LIBGUILE_MAJOR_VERSION, + LIBGUILE_MINOR_VERSION, LIBGUILE_REVISION_VERSION so that we now + define libguile.so version in a well-lit place. + + * configure.in: added AC_SUBST lines for the new LIBGUILE version + variables. + +2000-06-01 Michael Livshin + + * autogen.sh: call ./guile-aclocal.sh instead of aclocal. + + * guile-aclocal.sh: new file, works around aclocal problems. + +2000-05-30 Dirk Herrmann + + * acconfig.h (USE_FSU_PTHREADS, USE_MIT_PTHREADS, + USE_PCTHREADS_PTHREADS): Removed. + +2000-05-01 Gary Houston + + * Makefile.am: add include_HEADERS. + libguile.h: moved from libguile directory. maybe libguile.h should + be installed in $prefix/include/libguile/libguile.h instead? + +2000-04-21 Mikael Djurfeldt + + * qthreads.m4: Removed THREADS_CPPFLAGS. + + * acinclude.m4: Removed qthreads macros. They are provided in + qthreads.m4, so these were redundant. + + * acconfig.h (GUILE_DEBUG_MALLOC): New. + + * configure.in: New --enable-debug-malloc configuration option. + +2000-03-29 Mikael Djurfeldt + + * acconfig.h (GUILE_PTHREAD_COMPAT): New config variable. + + * configure.in: Enable workaround for COOP-linuxthreads + compatibility on Linux systems. + +2000-03-19 Mikael Djurfeldt + + * devel: New directory. Intended to carry documentation related + to Guile development (as opposed to the doc directory which + contains documentation related to the use of the current Guile). + This directory (devel) is not included in the Guile distribution, + but is accessible via anonymous CVS. + +2000-03-13 Mikael Djurfeldt + + * configure.in: Don't add iselect.o to LIBOBJS. + +2000-03-13 Mikael Djurfeldt + + * configure.in: Added end-tag for local variables. (Thanks to + Thien-Thi Nguyen.) + +2000-03-12 Gary Houston + + * README (Guile Documentation, About This Distribution): updated. + +2000-03-12 Mikael Djurfeldt + + * configure.in (ac_cv_struct_timespec): Added test for struct + timespec. + + * acconfig.h (HAVE_STRUCT_TIMESPEC): Added. + +2000-01-25 Marius Vollmer + + * autogen.sh: Call libtoolize. Pass --add-missing option to + automake. Do not decent into libltdl directory. The libltdl + directory is now populated by libtoolize and does not need any + further autogeneration. + +2000-01-23 Gary Houston + + * configure.in: check for fchown. + +Tue Jan 18 12:55:15 2000 Mikael Djurfeldt + + * acinclude.m4 (AC_LIBLTDL_CONVENIENCE): Add $(top_srcdir)/libltdl + instead of $(top_builddir)/libltdl to includepath. + +2000-01-18 Mikael Djurfeldt + + * emacs: New subdirectory for elisp tools. + +2000-01-15 Marius Vollmer + + * README, HACKING: Moved "Hacking it yourself" section from README + to HACKING. Updated recommended libtool version to be 1.3.4. + +2000-01-14 Gary Houston + + * configure.in: needs to have --disable-networking, not + --disable-net. + +2000-01-12 Mikael Djurfeldt + + * libltdl/acconfig.h: New file: Needed by autogen.sh. + +Tue Jan 11 13:42:35 2000 Greg J. Badros + + * autogen.sh: Added messages as we run autogen in subdirectories. + + * configure.in: Output libugile/guile-func-name-check script, and + chmod +x it. + +2000-01-11 Marius Vollmer + + * libltdl/autogen.sh: New file. + * autogen.sh: Invoke libltdl/autogen.sh. + +2000-01-09 Marius Vollmer + + Finally applied the libltdl patch from Thomas Tanner, with slight + modifications. All code copied from the libtool package is from + libtool-1.3.4. + + * configure.in: Make "--with-modules=yes" the default. Do not + clear INCLTDL, LIBLTDL prior to processing "--with-modules". + + 1999-07-25 Thomas Tanner + + * Makefile.am: add libltdl to SUBDIRS, automake automatically + includes ltconfig, ltmain.sh and acconfig.h in EXTRA_DIST + * acinclude.m4: remove GUILE_DLSYM_USCORE, add libtool.m4 + (no need to install libtool any more) + * configure.in: replace --enable-dynamic-linking with + --with-modules, required modules can be specified using + --with-modules="/path/to/mod.la" and will be linked + statically on platforms that don't support dynamic loading, + configure libltdl, configure libtool for dlopening + * libltdl: added using libtoolize -c --ltdl + +2000-01-09 Gary Houston + + * configure.in: check whether localtime caches TZ. copied from + Emacs 20.5. + * acconfig.h: add LOCALTIME_CACHE. + +Tue Dec 14 09:12:22 1999 Greg J. Badros + + * configure.in: Make it be guile-snarf.awk, since we'll be + switching names for guile-doc-snarf. (I wouldn't have changed + this, but I was getting ready to commit this way when the below + change was committed). + +1999-12-14 Mikael Djurfeldt + + * configure.in: Create guile-doc-snarf.awk. + +1999-12-12 Greg J. Badros + + * configure.in: Create guile-doc-snarf, chmod +x that script after + AC_OUTPUTted. + +1999-12-10 Greg J. Badros + + * NEWS: More complete description for --enable-debug-freelist. + +1999-12-09 Gary Houston + + * configure.in (CFLAGS): don't add -Wpointer-arith, since it + causes numerous spurious warnings with recent gcc and/or glibc + versions. + +1999-11-19 Gary Houston + + * acconfig.h: add HAVE_ARRAYS. + + * configure.in: add --disable-arrays option, probably temporary. + +1999-11-17 Gary Houston + + * configure.in: check for hstrerror. + +1999-10-05 Jim Blandy + + * autogen.sh: Don't call autoreconf at all; it's not reliable. + Instead, call the various tools explicitly. Invoke + guile-readline's autogen.sh script. + + Straighten up the situation regarding guile.m4 and qthreads.m4. + + We can't have .m4 files which are installed where aclocal can + see them, but also used by guile's own configure.in, because + aclocal will read both copies, complain about duplicate macro + definitions, and refuse to generate aclocal.m4 at all. This + happens if you invoke it as `aclocal -I .', as autoreconf does. + This is probably a flaw in the autotools, but Guile doesn't need + that flaw fixed immediately. + + guile.m4 is intended for use by people linking against guile, so + it needs to be installed. But Guile itself doesn't use it. So + move guile.m4 into guile-config. That makes sense, since + guile.m4's GUILE_FLAGS macro is just an easy way to call + guile-config. + + qthreads.m4 is indented to help configure a qthreads tree. It's + only useful to a package which actually includes a qthreads tree, + and it's intimately related to that tree, so it's not useful to + install this. So don't install it. + + * guile.m4: Moved to guile-config. + * Makefile.am (aclocaldir, aclocal_DATA): Delete. + (EXTRA_DIST): Move qthreads.m4 here. + + Don't store generated files in the repository any more. Instead, + require people to run autogen.sh on trees from snapshots and CVS. + * Makefile.in, aclocal.m4, configure: Deleted. + * autogen.sh: New file. + * ANON-CVS, SNAPSHOTS: Updated instructions. + +1999-10-02 Jim Blandy + + * acconfig.h (HAVE_POSIX, HAVE_NETWORKING): Add comments. + +1999-09-27 Greg J. Badros + + * configure.in: Added --enable-debug-freelist option. + + * acconfig.h: Added GUILE_DEBUG_FREELIST. + +1999-09-23 Gary Houston + + * acconfig.h: add HAVE_POSIX, HAVE_NETWORKING. remove FD_SETTER, + FILE_CNT_FIELD, FILE_CNT_GPTR, FILE_CNT_READPTR. + + * configure.in: new options --disable-posix, --disable-net + and --disable-regex + export HAVE_POSIX and HAVE_NETWORKING definitions. + don't add regex-posix.o to LIBOBJS if regex disabled. + + LIBOBJS: add filesys.c, posix.c, net_db.c, socket.c, + conditionally. + +1999-09-25 Jim Blandy + + * Guile 1.3.4 released. + +1999-09-22 Jim Blandy + + * configure.in: Call AM_PROG_CC_STDC before AM_PROG_LIBTOOL, so + libtool knows how to get ANSI C behavior from the compiler. + * configure: Regenerated. + +1999-09-20 Gary Houston + + * configure.in: check availability of siginterrupt. + +1999-09-18 Gary Houston + + * configure.in: use AC_SYS_RESTARTABLE_SYSCALLS instead of + testing for SA_RESTART. + +1999-09-12 Mikael Djurfeldt + + * configure.in: Removed ice-9/version.scm from AC_OUTPUT. + +1999-09-11 Jim Blandy + + * configure.in (GUILE_STAMP): Don't set this variable, or + substitute it into anything. Full explanation in ice-9/ChangeLog. + * configure, Makefile.in: Regenerated. + +1999-09-06 James Blandy + + Propagate the changes of 2 Sept the rest of the way through. + * configure: Regenerated. + * Makefile.in: Regenerated. Not sure why this diff is so big. + +1999-09-02 Jim Blandy + + * acinclude.m4 (GUILE_HEADER_LIBC_WITH_UNISTD): Fix typo in + variable name. (Thanks to Bill Schottstaedt.) + * aclocal.m4: Regenerated. + +1999-09-02 Mikael Djurfeldt + + * configure.in: Test for presence of function on_exit. + +1999-09-01 James Blandy + + * configure.in: Use AC_REPLACE_FUNCS to grab libguile/memmove.c if + the system doesn't have memmove. Don't test for memmove and bcopy + with AC_CHECK_FUNCS. + * configure: Regenerated. + +1999-08-30 Mikael Djurfeldt + + * configure.in: Test for atexit. + +1999-08-29 Mikael Djurfeldt + + * acinclude.m4: Updated. (Thanks to Karl Eichwalder.) + + * configure.in: Test for presence of S_ISLNK in sys/stat.h. + (Thanks to Bernard Urban.) + Test for memmove and bcopy. (Thanks to + suzukis@file.phys.tohoku.ac.jp.) + + * acconfig.h: Added HAVE_S_ISLNK. + +1999-08-20 James Blandy + + * Guile 1.3.2 released. + + * Makefile.in: Regenerated. + +1999-07-24 Mikael Djurfeldt + + * README, config.guess, config.sub, liconfig, ltmain.sh: Switched + to libtool-1.3.3. + +1999-07-22 Marius Vollmer + + Added guile-readline subdirectory with the removed readline + support. + * guile-readline: New directory, see ChangeLog there. + * configure.in: Cause configure to descend into guile-readline + dir. + * Makefile.am: Likewise for make. + * NEWS: Explain how to activate the readline support. + * configure, Makefile.in: Regenerated. + +1999-07-19 Jim Blandy + + Fixes for EMX from Mikael StÃ¥ldal. + + * configure.in: Check for . + * configure: Regenerated. + +1999-07-18 Jim Blandy + + * qthreads.m4 (QTHREADS_CONFIGURE): 'alpha' in a configuration + name can have suffixes, like alphaev56-unknown-linux-gnu. + * aclocal.m4, configure: Rebuilt. + (Thanks to Sebastien Villemot.) + +1999-07-04 Gary Houston + + * configure.in: don't check for ways to violate stdio abstraction. + +1999-05-02 Jim Blandy + + * configure.in (AC_CHECK_FUNCS): Fill in list of functions that + libguile/net_db.h wants to use. (Add setprotoent, setservent.) + +1999-04-17 Jim Blandy + + Remove all automatic readline support, to avoid copyright + confusion. + * INSTALL: Update text. + * NEWS: Explain the situation. + * configure.in: Remove configury for readline and its supporting + libraries. + * configure: Regenerated. + + * README: Change URL's for automake and autoconf. + + * Makefile.in, configure: Regenerated with autoconf 2.13, automake + 1.4, libtool 1.2f (1.385 1999/03/15 17:24:54). I've upgraded to + all the right tools, according to README, but I'm still getting + different results than Mikael is. Hmm. + +1999-03-22 Mikael Djurfeldt + + * New libtool: 1.2f + * ltmain.sh, ltconfig, config.guess, config.sub: New versions. + * README: Mention new version number of libtool. + +1999-03-04 Mikael Djurfeldt + + New automake: 1.4 + * config.guess, config.sub, install-sh, mdate-sh, missing, + mkinstalldirs: New versions. + * Makefile.in, aclocal.m4, configure: Regenerated. + * README: Mention new version numbers on autoconf and automake. + +1999-02-12 Jim Blandy + + * configure.in: Add --with-readline flag. + * configure: Rebuilt. + +1999-02-09 Maciej Stachowiak + + * NEWS: Added entry for optargs module. + +1999-02-06 Jim Blandy + + * configure: Regenerated using autoconf 2.12. + +1999-01-26 Mikael Djurfeldt + + * configure.in: Removed test AC_C_BIGENDIAN. (This test was + considered to encourage bad coding style.) + +1999-01-21 Mikael Djurfeldt + + * configure.in: Added test AC_C_BIGENDIAN. + +1999-01-11 Jim Blandy + + * configure.in: Remove quotes around ac_cv_lib_readline_main and + ac_cv_var_rl_getc_function. They should both always be set to + non-null values; this way, we get error messages. + * configure: Regenerated. + +1999-01-10 Jim Blandy + + * configure.in: Cite the variable ac_cv_lib_readline_main, not + ac_cv_lib_readline_readline; the latter isn't set any more, since + we look for 'main' in libreadline now. Add quotes around + reference to the variable references, too, so this will work even + when a variable's value is the empty string. + * configure: Regenerated. + +1999-01-07 Mikael Djurfeldt + + * acconfig.h: Added HAVE_LONG_LONGS. + + * configure.in: Added AC_CHECK_SIZEOF(long), AC_CHECK_SIZEOF(int); + Added check for long longs. + +1998-12-14 Jim Blandy + + * configure.in: Check for tgoto in ncurses, then termcap. + S.u.S.E. Linux doesn't have a termcap. (Thanks to Karl + Eichwalder.) + * configure: Regenerated. + +1998-10-24 Jim Blandy + + * configure.in: Call AM_PROG_CC_STDC, to see what flags we should + pass the compiler to make it support ANSI. (Thanks to Bernard + Urban.) + * aclocal.m4, configure: Regenerated. + +1998-10-20 Jim Blandy + + * Guile 1.3 released. + +1998-10-19 Jim Blandy + + * GUILE-VERSION: Bump to 1.3. + + * Makefile.am (EXTRA_DIST): Don't omit ANON-CVS and SNAPSHOTS. + * Makefile.in: Regenerated. + +1998-10-16 Jim Blandy + + * qthreads.m4 (QTHREADS_CONFIGURE): On NetBSD, pass through a flag + to the Makefile which explicitly tells it to pass assembly files + through the preprocessor. (Thanks to Perry Metzger.) + * aclocal.m4, configure, Makefile.in: Regenerated. + +1998-10-14 Jim Blandy + + * configure.in: Define SCM_SINGLES whenever a float can fit in a + long, not only when a float is the same size as a long. This gets + us SCM_SINGLES defined on alphas. (Thanks to Clark McGrew.) + * configure: Regenerated. + + * configure.in: Construct libguile/versiondat.h here; see + log entry in libguile/ChangeLog for details. + * configure: Regenerated. + + * configure.in: Allow tabs and whitespace between `void' and + `usleep'. (Thanks to Harvey J. Stein.) + * configure: Regenerated. + + Don't redefine sleep/usleep. + * configure.in: Remove tests for usleep's argument type; we only + need that if we're going to replace it. + + * acconfig.h (USLEEP_ARG_TYPE): Delete. All the other SLEEP + garbage is needed just to use usleep and sleep without compiler + warnings. + * configure: Regenerated. + +1998-10-12 Jim Blandy + + * configure: Regenerated. + + * configure.in (GUILE_FUNC_DECLARED): Name the cache variables + starting with guile_cv_; ac_cv_ is autoconf's namespace. + + The type of the argument to usleep varies from system to system, + as does the return type. We really shouldn't be redefining usleep + at all, but I don't have time to clean that up before the 1.3 + release. It's on the schedule for afterwards. + * configure.in: Cache results from usleep return value test. + Test for the type of the usleep argument, and cache that too. + * acconfig.h (USLEEP_ARG_TYPE): New macro. + +1998-10-11 Jim Blandy + + * acconfig.h (HAVE_RL_GETC_FUNCTION): Fix this entry. + +1998-10-10 Jim Blandy + + * GUILE-VERSION: bump to 1.2.91, since we're doing snapshots again. + + * Guile 1.2.90 released --- beta. + * GUILE-VERSION: Set to 1.2.90. This would appear to be a + regression from 1.3a, but everyone knows that the next release is + 1.3, I want to switch to a more coherent version numbering system, + and now is the time. + +1998-10-09 Jim Blandy + + * configure.in: Call AC_C_INLINE, so we can use inline happily in + libguile. + * configure: Regenerated. + +1998-10-07 Jim Blandy + + * configure.in: Don't forget to #define HAVE_RL_GETC_FUNCTION if + we do find the rl_getc_function variable in the readline library; + AC_CHECK_FUNCS used to do this for us, but we're not using it any + more. + * acconfig.h: Add an entry for HAVE_RL_GETC_FUNCTION. + + * configure.in: Properly test for the presence of rl_getc_function; + it's a variable, not a function. + * configure: Regenerated. + + * doc: New subdirectory. + * Makefile.am (SUBDIRS): List it. + * configure.in (AC_OUTPUT): Build its Makefile. + * configure, Makefile.in: Regenerated. + + * guile.m4 (GUILE_FLAGS): New macro. + + * guile.m4 (AM_INIT_GUILE_MODULE): Deleted; it doesn't do anything + terribly helpful any more, nobody's using it, and this is not + really the way I want to handle modules anyway. + +1998-10-03 Jim Blandy + + * configure.in (FD_SETTER, FILE_CNT_GPTR): New cases for SCO's + stdio implementation. (Thanks to David Tillman.) + * configure: Rebuilt. + + * guile-config: Renamed from `build'. + * Makefile.am (SUBDIRS): Mention `guile-config', not `build'. + * configure.in: Create `guile-config/Makefile.in', not + `build/Makefile.in'. Doc fix, too. + + * qthreads.m4: Doc fix. + * Makefile.in, aclocal.m4, configure: Regeneranegerederadea. + +1998-10-03 + + * configure.in: Check for a missing `sleep' declaration. + * acconfig.h (MISSING_SLEEP_DECL): Provide some text for this. + * configure: Regenerated. + + * configure.in: Don't use the canonical host name to decide + whether `bzero' and `usleep' have declarations --- that's going + back to the bad old days before autoconf. Remove the call to + AC_CANONICAL_HOST and the subsequent case statement. + (GUILE_FUNC_DECLARED): New m4 macro. Use it to check for + declarations for `bzero', `usleep', and (new!) `strptime'. + * acconfig.h: (DECLARE_BZERO, DECLARE_USLEEP): Removed. + (MISSING_BZERO_DECL, MISSING_USLEEP_DECL, MISSING_STRPTIME_DECL): + Added. I think this naming convention is more consistent with the + rest of autoconf; names generally describes the system, not what + the package should do to accomodate the system. + * configure: Regenerated. + +1998-09-05 Jim Blandy + + * configure.in: Remove --disable-debug option. The debugging + support is pretty stable now, and it's confusing people. + * configure: Regenerated. + + * HACKING: Remove -Wstrict-prototypes from the list of requested + flags (to match 1998-07-30 change). + +1998-07-30 Jim Blandy + + * configure.in: Don't use -Wstrict-prototypes after all. + * configure: Regenerated. + +1998-07-29 Jim Blandy + + * configure.in: Request more warnings. + * configure: Regenerated. + * HACKING: Ask people not to make changes that introduce those + warnings. Now I have to go through the code and actually bring it + up to standards... :( + + * Makefile.in, aclocal.m4, configure: Regenerated using the last + public version of automake, not the hacked Cygnus version. + * config.guess, config.sub, ltconfig, ltmain.sh: New versions from + libtool. + + * configure.in, qthreads.m4: Display a message about how the + threads configuration went. + * aclocal.m4, configure: Regenerated. + +1998-07-28 Jim Blandy + + Remove the TOTORO kludge. We're not doing snapshots any more, so + totoro is completely uninvolved. (Poor Totoro!) + * configure.in: Remove code to check the hostname and #define + TOTORO. + * acconfig.h: Remove comments for TOTORO symbol. + * configure, Makefile.in: Regenerated. + + * qthreads.m4 (QTHREADS_CONFIGURE): We *can* use AC_REQUIRE here + to get AC_PROG_LN_S. + * aclocal.m4, configure: Regenerated. + +1998-07-26 Jim Blandy + + Clean up thread configuration. + * qthreads.m4: New file, which knows how to configure the qthreads + library. + * configure.in: Replace all thread package selection code. Do the + --with-threads argument processing here. Enable the appropriate + thread interface files in libguile. Remove all qthreads + configuration code; call QTHREADS_CONFIGURE instead. Set + GUILE_LIBS using the info provided by QTHREADS_CONFIGURE. + * threads.m4: Removed; not used any more. + * Makefile.am (aclocal_DATA): Mention qthreads.m4, not threads.m4. + * Makefile.in, aclocal.m4, configure: Rgnrtd. (Sv th vwls!) + Note that these were regenerated with the tools available from + Cygnus's source tree, which have patches not available to the + general public. I'm not sure this was a good idea; feel free to + revert them to the latest released versions of the tools. + + Upgrade to the version of libtool available at Cygnus. See note + above. + * config.guess, config.sub, ltconfig, ltmain.sh: Upgraded. + +1998-07-12 Mikael Djurfeldt + + * configure.in: Changed variable HOSTNAME --> PROG_HOSTNAME in + totoro kludge. + +Sat Jul 11 21:54:29 1998 Mikael Djurfeldt + + * acconfig.h, configure.in: Define TOTORO if configuring on + totoro.red-bean.com. + + * configure.in: Check for strdup. + +1998-05-19 Mikael Djurfeldt + + * configure.in: Check for rl_cleanup_after_signal. + +1998-05-11 Mikael Djurfeldt + + * configure.in: Added test for rl_getc_function. Warn if + libreadline is found but not this function. + +1998-05-06 Mikael Djurfeldt + + * configure.in: Replaced some AC_CHECK_FUNC --> AC_CHECK_FUNCS so + that suitable HAVE_ symbols get defined. + +1998-04-25 Mikael Djurfeldt + + * configure.in: Define USLEEP_RETURNS_VOID on some systems. + (Thanks to Julian Satchell.) + +1998-04-20 Mikael Djurfeldt + + * configure.in: Check for usleep; Define DECLARE_BZERO and + DECLARE_USLEEP on Solaris 2.5 since it supplies those functions + without declaring them. + + * acconfig.h: Added DECLARE_BZERO, DECLARE_USLEEP + +1998-04-19 Mikael Djurfeldt + + * configure.in: Define HAVE_DLOPEN also when HAVE_LIBDL is + defined. + +1998-04-18 Mikael Djurfeldt + + * configure.in (GUILE_LIBS): New variable. Contains libraries + which libguile needs to be linked with. Substituted into + libpath.h. + + * threads.m4 (threads_package): Don't add $LDFLAGS and $LIBS to + $cy_cv_threads_libs. + +1998-04-11 Mikael Djurfeldt + + New libtool: 1.2 + * ltconfig, ltmain.sh, config.sub, config.guess: Updated. + New automake: 1.3 + * Makefile.in, aclocal.m4, configure: Regenerated. + * README: Mention new version numbers on libtool and automake. + +1997-12-11 Tim Pierce + + * HACKING: Note that SSH is mandatory for CVS access. + +Sun Dec 7 06:11:24 1997 Gary Houston + + * README: using Automake 1.2d + * configure.in: AC_CHECK_FUNCS: add "system". + +1997-12-01 Tim Pierce + + * acconfig.h: Add USCORE. + +1997-11-27 Mikael Djurfeldt + + * configure.in: Added code to enable GUILE_ISELECT on systems + which have the necessary functions (gettimeofday, select). + + * acconfig.h: Added GUILE_ISELECT. + +1997-11-24 Tim Pierce + + * acinclude.m4: Assume dlsym does not add underscore if + cross-compiling. + * aclocal.m4, configure: Regenderated. + +1997-11-21 Tim Pierce + + * acinclude.m4 (GUILE_DLSYM_USCORE): New macro, thanks Dan Hagerty + . + * configure.in: Use it. + * configure: Regenerated. + * acconfig.h (DLSYM_ADDS_USCORE): New #define. + +1997-10-26 Mikael Djurfeldt + + * README (libtool): Tell people to use version 1.0e. + +Sat Oct 25 02:50:43 1997 Jim Blandy + + Call the QuickThreads library libqthreads.a, not libqt.a. The old + name conflicts with the Qt user interface toolkit. + * threads.m4 (CY_AC_WITH_THREADS): Use new library name. + * configure.in: Same. + * aclocal.m4, configure: Regenerated. + +Thu Oct 23 00:58:06 1997 Jim Blandy + + * configure.in: Check for the readline library, and the termcap + library (on which readline relies). + * configure: Regenerated. + +Wed Oct 22 16:55:57 1997 Jim Blandy + + New libtool: 1.0e + * ltconfig, ltmain.sh, config.sub, config.guess: Updated. + * configure, aclocal.m4: Regenerated. + +1997-10-02 Marius Vollmer + + Make dynamic linking work on Dec Unix. (Thanks to Clark McGrew) + * configure.in: Check whether dlopen can be found without -ldl. + +Mon Sep 29 23:52:52 1997 Jim Blandy + + * Makefile.in: Regenerated with automake 1.2c. + +Sat Sep 27 23:01:58 1997 Jim Blandy + + * Makefile.am: Add new `build' subdirectory to SUBDIRS. + * configure.in: Add build/Makefile to AC_OUTPUT clause. + * Makefile.in, configure: Regenerated. + + * Makefile.in, aclocal.m4: Regenerated with automake 1.2a. + +Tue Sep 16 00:19:46 1997 Mikael Djurfeldt + + * README, ltconfig, ltmain.sh: New libtool: 1.0c. + +Thu Sep 11 11:28:24 1997 Mikael Djurfeldt + + * ltmain.sh: Added a missing '\' before \n on line 32. + +Thu Aug 28 23:40:43 1997 Jim Blandy + + New libtool: 1.0b. + * ltconfig, ltmain.sh, config.guess: Freshly libtoolized. + * Makefile.in, aclocal.m4, configure: Regenerated, salamander-style. + +Wed Aug 27 11:35:09 1997 Jim Blandy + + * Makefile.in: Regenerated, so it uses "tar", not "gtar". + + * configure.in: Use the QuickThreads assembler fragment with Irix + dynamic linking support for Irix 6 as well as Irix 5. Thanks to + Jesse Glick. + * configure: Regenerated. + +Sun Aug 24 15:51:12 1997 Mikael Djurfeldt + + * acinclude.m4 (GUILE_NAMED_CHECK_FUNC): New macro: Tagged test, + so that test for the same function can be performed multiple + times. + + * configure.in (AC_CHECK_HEADERS): Test for rxposix.h, + rx/rxposix.h. Add library rx only if regcomp can't be found + without it. + + * acconfig.h (HAVE_REGCOMP): Added it here since autoheader misses + it for some reason! + +Fri Aug 22 21:21:49 1997 Jim Blandy + + * THANKS: New file. + * Makefile.in, aclocal.m4, configure: Regenerated. + +Wed Jul 23 20:24:27 1997 Mikael Djurfeldt + + * configure.in: Added thread support for the alpha architecture. + configure: Regenerated. + +Thu Jul 17 07:56:05 1997 Gary Houston + + * configure.in: use AC_CHECK_FUNCS for sethostent etc., + so scmconfig.h is updated with the test results. this may + disable one of the cygwin hacks. + +Fri Jul 11 00:18:19 1997 Jim Blandy + + Changes to compile under gnu-win32, from Marcus Daniels: + * configure.in: When sys/un.h exists, define HAVE_UNIX_DOMAIN_SOCKETS + to indicate that Unix domain sockets will work. + Check for socketpair, getgroups, setwent, pause, and tzset + (cygwin currently lacks these them). + Check for sethostent endhostent getnetent setnetent endnetent + getprotoent endprotoent getservent endservent getnetbyaddr + getnetbyname inet_lnaof inet_makeaddr inet_netof (cygwin currently + lacks them). In the case of cygwin, temporarily prefix these + functions with "cygwin32_", the way that netdb.h does. + Don't define HAVE_REGCOMP unless both regcomp and regex.h are + available (cygwin b18 came distributed without a working regex.h + file). + * acconfig.h (HAVE_UNIX_DOMAIN_SOCKETS): Add this. + * configure: Regenerated. + +Wed Jul 2 12:28:40 1997 Tim Pierce + + * ltmain.sh: Remove any trailing colon on $shlibpath_var + (i.e. LD_LIBRARY_PATH) for braindamaged linkers that choke on it. + Patch sent to bug-libtool. + +Sat Jun 28 16:13:43 1997 Tim Pierce + + * configure.in: Add alloca.o explicitly to LIBOBJS (thanks Eric + Backus for reporting this problem and suggesting a fix). + * configure: Regenerated. + +Thu Jun 26 20:43:31 1997 Jim Blandy + + * Guile 1.2 released. + + * configure.in: Check for librx after libm; fundamentals need to + come first. + * configure: Regenerated. + +Tue Jun 24 13:34:20 1997 Tim Pierce + + * aclocal.m4 (AM_PATH_PROG_LD): Change `ac_cv_path_LD' typo to + `am_cv_path_LD'. + * configure: Regenerated. + +Sun Jun 22 15:43:07 1997 Jim Blandy + + Try to detect when people are using one version of libguile and a + different version of ice-9. People have been skewing things and + sending in bug reports. + * configure.in: Provide libguile its version information through a + separate header file generated by the Makefile, not through + scmconfig.h. + (GUILE_MAJOR_VERSION, GUILE_MINOR_VERSION, GUILE_VERSION): + AC_SUBST these, instead of AC_DEFINE'ing them. + (GUILE_STAMP): New AC_SUBST: the time we configured the tree. + (AC_OUTPUT): Create ice-9/version.scm. + * acconfig.h (GUILE_MAJOR_VERSION, GUILE_MINOR_VERSION, + GUILE_VERSION): Deleted. + * Makefile.in: Regenerated. + + * aclocal.m4: Regenerated, using the libtool 0.9h m4 macros. + + * Makefile.am (EXTRA_DIST): Include acconfig.h in the + distribution. + * Makefile.in: Regenerated. + +Sat Jun 21 00:14:07 1997 Jim Blandy + + * ltmain.sh (line 1191): Don't forget 'test' in if statement. + + * ltconfig, ltmain.sh: libtoolized, using libtool 0.9h. + +Wed Jun 11 00:34:01 1997 Jim Blandy + + * ltconfig, ltmain.sh, config.guess: New files from libtool 0.9g. + + * configure.in: By default, include functions in Guile to allow + linking with dynamic libraries at run-time. In other words, + --enable-dynamic-linking is now the default. + * configure: Rebuilt. + + * configure.in: Remove space between AC_CHECK_LIB and opening + paren in check for Rx. + * configure: Regenerated. + + * configure.in: Remove all mention of xtra_PLUGIN_guile_libs. + It's never used. + * configure, Makefile.in: Regenerated. + +Tue Jun 10 23:37:12 1997 Jim Blandy + + * configure.in: Move checks for libraries (-lm, -lnsl, -lsocket, + -dl, -dld) before checks for functions. + * configure: Regenerated. + +Mon Jun 9 02:35:46 1997 Tim Pierce + + * config.guess: New copy from autoconf-2.12, which recognizes + OpenBSD. + +Tue Jun 3 16:34:19 1997 Jim Blandy + + * configure.in: Check for Rx, so we will use its routines (which I + pretty much trust) if it is installed. + * configure: Regenerated. + +Sat May 31 03:48:45 1997 Gary Houston + + * acconfig.h: mention HAVE_RESTARTS. + * configure.in: check for sigaction and restartable system calls. + +Tue May 27 22:47:52 1997 Tim Pierce + + * configure.in: Check for presence of regcomp. + * configure: Regenerated. + +Mon May 26 12:14:20 1997 Jim Blandy + + * COPYING: New address for FSF. + + * configure.in: We don't need to add fileblocks.o to LIBOBJS if + struct stat doesn't have the st_blocks field. We take care of + that case in the code. Replace AC_STRUCT_ST_BLOCKS with its + definition, edited appropriately. (Bernard URBAN) + * configure: Regenerated. + +Sat May 17 13:49:28 1997 Jim Blandy + + * configure.in: Don't link against -lnsl or -lsocket unless we + actually need to. This causes trouble on Irix. (Thanks to Larry + Schwimmer.) + + * config.sub: Get newer version, that recognizes the i686. + +Fri May 16 17:26:10 1997 Jim Blandy + + * README: Changed Mikael's threads work attribution in order + to sooth Anthony's enormous, but wounded, ego. + +Fri May 16 17:26:53 1997 Jim Blandy + + Just kidding!!! + +Fri May 16 04:24:48 1997 Jim Blandy + + Guile 1.1 released. + * GUILE-VERSION: Bump to 1.1. + +Tue May 13 16:34:40 1997 Jim Blandy + + Switch to automake-1.1p. + * Makefile.in, aclocal.m4, configure: Regenerated. + +Mon May 12 18:29:45 1997 Jim Blandy + + * threads.m4: Copy Anthony's change here, so it'll actually + survive. + +Thu May 8 11:48:40 1997 Anthony Green + + * aclocal.m4: Fixes for building with coop threads in a + seperate compilation directory. + * configure: Rebuilt. + +Fri May 2 16:24:15 1997 Jim Blandy + + Upgrade to libtool 0.9e. + * ltconfig, ltmain.sh, config.guess, config.sub: New versions, + supplied by libtool. + + * configure.in: When configuring qt, sunos needs the underscore + files; Solaris and Linux both need the normal files. + * configure: Reebilt. + +Thu May 1 15:35:49 1997 Jim Blandy + + * configure.in: Get the paths for qt's md files right, so it can + build correctly when using a separate compilation directory. + * configure: Regenerated. + +Thu Apr 24 01:20:34 1997 Jim Blandy + + Get threads to work again. + * Makefile.am (SUBDIRS): List libguile last, so qt gets built + first. + * Makefile.in: Regenerated. + * aclocal.m4, configure: Regenerate, with modern definition of + CY_AC_WITH_THREADS. Where did the old text come from? Creepy... + + Reduced Guile distribution: one configure script, no plugins. + * configure.in: Merged the old text from qt/configure.in and + libguile/configure.in; Tom Tromey says automake only wants one + configure.in script. This seems fishy, but... + * Makefile.am: List the subdirectories explicitly; no more PLUGIN + gubbish. + * acconfig.h, acinclude.m4: Moved here from libguile, since + libguile's configure script lives here now. + * AUTHORS, INSTALL, README: Updated. + * Makefile.in, aclocal.m4 configure: Regenerated. Just like + amputated amphibian limbs. + +Tue Apr 22 16:57:38 1997 Jim Blandy + + * newdoc/ref/Makefile.am (dist_texis): Distribute the index files. + * newdoc/ref/Makefile.in: Regenerated. + +Mon Apr 14 18:51:25 1997 Jim Blandy + + * threads.m4 (CY_AC_WITH_THREADS): When using coop threads, no + need to link against libthreads; the files it used to contain + are now a part of libguile. + +Sun Apr 13 22:14:10 1997 Jim Blandy + + * guile.m4: Revert change of Mar 15, and use the new 'no-define' + argument to the AM_INIT_AUTOMAKE macro. + +Fri Apr 11 15:43:07 1997 Jim Blandy + + * ltconfig, ltmain.sh: Upgraded libtool files to 0.9d. + * README: Say where to find libtool 0.9d. + +Wed Apr 9 17:51:13 1997 Jim Blandy + + Changes to work with automake-1.1n, which has better libtool + support. Also use libtool 0.8. + * README: Note new version numbers for automake and libtool. + * missing: New file required by new automake. + * Makefile.in: Regenerated. + +Sat Apr 5 16:48:38 1997 Jim Blandy + + * newdoc/ref/scheme.texi (set-object-property!): Fix function name. + + * Makefile.am: Omit doc subtree. + * configure.in: Omit makefiles in doc subtree. + * Makefile.in, configure: Rebuilt. + +Sat Mar 15 01:11:44 1997 Mikael Djurfeldt + + * guile.m4 (AM_INIT_GUILE_MODULE): Replaced AM_INIT_AUTOMAKE macro + with its definition and commented out definition of PACKAGE. This + changed seemed necessary after having removed PACKAGE from + libguile/acconfig.h. + +Mon Feb 24 21:43:26 1997 Mikael Djurfeldt + + * ltconfig, ltmain.sh: New versions from libtool-0.9. + + * configure.in: Added AM_MAINTAINER_MODE + +Fri Feb 7 17:57:46 1997 Jim Blandy + + * config.sub, config.guess: New versions, that handle i686, etc. + +Thu Jan 23 07:06:15 1997 Mark Galassi + + * newdoc/tutorial/guile-tut.texi: started checking in the Guile + tutorial rewrite, but have not merged much into it yet. + +Tue Jan 21 17:28:40 1997 Mark Galassi + + * newdoc/ref/guile-ref.texi: started checking in parts of the + reference manual re-write. + +Sat Jan 11 14:40:17 1997 Marius Vollmer + + * ltconfig, ltmain.sh: New files for libtool support. libguile, + rx, gh and gtcltk-lib can now be build as shared libraries. + * Makefile.am (EXTRA_DIST): Added ltconfig and ltmain.sh + +Sun Jan 5 16:57:10 1997 Jim Blandy + + * Guile 1.0 released. This is the first release by the Free + Software Foundation; Cygnus has also released earlier versions of + Guile. + + * GUILE-VERSION: Updated version number. + * NEWS: Added comments for all the user-visible changes marked in + the ChangeLogs. + * README: Updated for release. + +Thu Dec 12 00:14:32 1996 Gary Houston + + * scsh: new directory. + +Mon Dec 2 17:33:04 1996 Tom Tromey + + * configure.in: Generate doc/guile-programmer/Makefile and + doc/guile-user/Makefile. + +Sat Nov 30 23:45:54 1996 Tom Tromey + + * aclocal.m4: Now automatically generated by aclocal. + * threads.m4: New file. + * guile.m4: New file. + * Makefile.am, doc/Makefile.am: New files. + * configure.in: Updated for Automake. Avoid excessively verbose + "greet" messages. + +Wed Oct 16 07:32:14 1996 Mark Galassi + + * lgh: directory renamed to gh, along with all prefixes of the + high level library procedures. + +Thu Oct 10 14:37:43 1996 Jim Blandy + + * Makefile.in (TAGS tags): Find the source files in $srcdir. + +Wed Oct 9 19:37:14 1996 Jim Blandy + + * Makefile.in (DISTFILES): Add AUTHORS and aclocal.m4. + +Tue Oct 1 00:13:55 1996 Mikael Djurfeldt + + * configure.in: Added some configuration magic from the Cygnus + distribution. + + * aclocal.m4: New file. For now used for thread support + configuration. + +Fri Sep 13 14:39:30 1996 Mark Galassi + + * Makefile.in (DISTFILES): added mkinstalldirs to the DISTFILES + + * PLUGIN: changed the PLUGIN/REQ files in the ice-9 and lgh + directories, to arrange for lgh to the last thing + configured/built. + +Wed Sep 11 21:11:33 1996 Mark Galassi + + * lgh/: added the directory in which I implement the high level + libguile library (lgh_) for this release of Guile. See the + ChangeLog in there for further details. + +Wed Sep 11 16:12:53 1996 Mark Galassi + + * doc/ (guile-user and guile-programmer): added the guile-user and + guile-programmer directories which contain the user and programmer + manuals. See the ChangeLog entries there for detail. + +Wed Sep 11 14:33:49 1996 Jim Blandy + + * Makefile.in (distclean): Don't forget to delete doc/Makefile. + + * Makefile.in (distclean): Don't forget to delete + config.build-subdirs. + +Thu Sep 5 17:36:15 1996 Jim Blandy + + * Makefile.in (tags): New name for `TAGS' target, which will + always run the commands. + +Thu Sep 5 09:56:50 1996 Jim Blandy + + * README: Doc fixes. + +Fri Aug 30 16:56:27 1996 Jim Blandy + + * Makefile.in (TAGS): Produce a single tags file for all of Guile. + +Thu Aug 15 19:03:03 1996 Jim Blandy + + * configure.in: Check for -ldl, so the check for Tcl won't fail + spuriously. + +Thu Aug 15 01:29:29 1996 Jim Blandy + + Change the way we decide whether to build gtcltk-lib, so that it's + omitted from the build process when appropriate, but never from + the dist process. + * configure.in: Don't edit all_subdirs depending on the + availability of Tk; let that be the list of all PLUGIN + subdirectories present, as it used to be. Instead, edit a new + variable, build_subdirs; write its final value, the list of + subdirs we do want to compile in, to config.build-subdirs. + Substitute that into the top-level Makefile too. + * Makefile.in (subdirs): Set this to @build_subdirs@, so we only + recurse on the subdirectories we should build. + (distdirs): Set this to @existingdirs@, so it includes the subdirs + we decided not to build. + + * doc/gtcltk.texi: File resurrected from old Guile releases. + * doc/Makefile.in (info): Build the gtcltk documentation. + (DIST_FILES): Include it in the distribution. + + * configure.in: If we can find the library for tcl7.5, build + gtcltk-lib. Call AC_PROG_CC, to help run that test with the right + compiler (not sure this is necessary). + +Mon Aug 12 15:09:37 1996 Jim Blandy + + * NEWS: Fix bug reporting address. + +Fri Aug 9 15:58:42 1996 Jim Blandy + + * AUTHORS: New file, in accordance with the GNU maintainers' + standards. + +Tue Aug 6 14:40:44 1996 Jim Blandy + + * README: Renamed from ANNOUNCE; include bug report address, + description, and short tour. + * INSTALL: Renamed from BUILDING. + * NEWS: New file. + * Makefile.in (DISTFILES): Update appropriately. + +Thu Aug 1 02:31:53 1996 Jim Blandy + + * doc/Makefile.in: Added pattern targets for creating DVI and + PostScript files. + (%.ps, %.dvi, %.txt): New targets. + (DVIPS, TEXI2DVI): New variables. + + * GUILE-VERSION: Updated to 1.0b3. + + Rehashed distribution system, in preparation for nightly + snapshots. Other changes in subdirectories. + * Makefile.in (dist): Rewritten --- the old target was out of + date, dependent on files that we don't have, and relied on GNU + tar. The new target is simpler. + (VERSION, srcdir, dist_dirs): New variables. + (DISTFILES): Renamed from localfiles. Added GUILE-VERSION and + TODO. + (localtreats): Variable removed. We don't have this file. + (info): cd to doc and make info there; don't make info in every + ${subdir}; those Makefiles don't know what to do. + (distname, distdir, treats, announcefile): Variables removed. + (manifest-file): Target removed. + (dist-dir): New target, responsible for distributable files in + this directory. + (GZIP, GZIP_EXT, TAR_VERBOSE, DIST_NAME): New variables, + controlling the 'dist' target. + * configure.in: Substitute GUILE-VERSION into the top-level + Makefile. Build doc/Makefile from doc/Makefile.in. + + * doc/Makefile.in: New file. + + +;; Local Variables: +;; coding: utf-8 +;; End: diff --git a/guile18/GUILE-VERSION b/guile18/GUILE-VERSION new file mode 100644 index 0000000000..020f95e31d --- /dev/null +++ b/guile18/GUILE-VERSION @@ -0,0 +1,56 @@ +# -*-shell-script-*- + +GUILE_MAJOR_VERSION=1 +GUILE_MINOR_VERSION=8 +GUILE_MICRO_VERSION=8 + +GUILE_EFFECTIVE_VERSION=${GUILE_MAJOR_VERSION}.${GUILE_MINOR_VERSION} +GUILE_VERSION=${GUILE_EFFECTIVE_VERSION}.${GUILE_MICRO_VERSION} + +# For automake. +VERSION=${GUILE_VERSION} +PACKAGE=guile + +# All of the shared lib versioning info. Right now, for this to work +# properly, you'll also need to add AC_SUBST calls to the right place +# in configure.in, add the right -version-info statement to your +# Makefile.am The only library not handled here is +# guile-readline/libguile-readline. It is handled in +# ./guile-readline/LIBGUILEREADLINE-VERSION. + +# See libtool info pages for more information on how and when to +# change these. + +LIBGUILE_INTERFACE_CURRENT=21 +LIBGUILE_INTERFACE_REVISION=0 +LIBGUILE_INTERFACE_AGE=4 +LIBGUILE_INTERFACE="${LIBGUILE_INTERFACE_CURRENT}:${LIBGUILE_INTERFACE_REVISION}:${LIBGUILE_INTERFACE_AGE}" + +# NOTE: You must edit each corresponding .scm file (the one that +# dynamic-links the relevant lib) if you change the versioning +# information here to make sure the dynamic-link explicitly loads the +# right shared lib version. + +LIBGUILE_SRFI_SRFI_1_MAJOR=3 +LIBGUILE_SRFI_SRFI_1_INTERFACE_CURRENT=3 +LIBGUILE_SRFI_SRFI_1_INTERFACE_REVISION=2 +LIBGUILE_SRFI_SRFI_1_INTERFACE_AGE=0 +LIBGUILE_SRFI_SRFI_1_INTERFACE="${LIBGUILE_SRFI_SRFI_1_INTERFACE_CURRENT}:${LIBGUILE_SRFI_SRFI_1_INTERFACE_REVISION}:${LIBGUILE_SRFI_SRFI_1_INTERFACE_AGE}" + +LIBGUILE_SRFI_SRFI_4_MAJOR=3 +LIBGUILE_SRFI_SRFI_4_INTERFACE_CURRENT=3 +LIBGUILE_SRFI_SRFI_4_INTERFACE_REVISION=1 +LIBGUILE_SRFI_SRFI_4_INTERFACE_AGE=0 +LIBGUILE_SRFI_SRFI_4_INTERFACE="${LIBGUILE_SRFI_SRFI_4_INTERFACE_CURRENT}:${LIBGUILE_SRFI_SRFI_4_INTERFACE_REVISION}:${LIBGUILE_SRFI_SRFI_4_INTERFACE_AGE}" + +LIBGUILE_SRFI_SRFI_13_14_MAJOR=3 +LIBGUILE_SRFI_SRFI_13_14_INTERFACE_CURRENT=3 +LIBGUILE_SRFI_SRFI_13_14_INTERFACE_REVISION=1 +LIBGUILE_SRFI_SRFI_13_14_INTERFACE_AGE=0 +LIBGUILE_SRFI_SRFI_13_14_INTERFACE="${LIBGUILE_SRFI_SRFI_13_14_INTERFACE_CURRENT}:${LIBGUILE_SRFI_SRFI_13_14_INTERFACE_REVISION}:${LIBGUILE_SRFI_SRFI_13_14_INTERFACE_AGE}" + +LIBGUILE_SRFI_SRFI_60_MAJOR=2 +LIBGUILE_SRFI_SRFI_60_INTERFACE_CURRENT=2 +LIBGUILE_SRFI_SRFI_60_INTERFACE_REVISION=2 +LIBGUILE_SRFI_SRFI_60_INTERFACE_AGE=0 +LIBGUILE_SRFI_SRFI_60_INTERFACE="${LIBGUILE_SRFI_SRFI_60_INTERFACE_CURRENT}:${LIBGUILE_SRFI_SRFI_60_INTERFACE_REVISION}:${LIBGUILE_SRFI_SRFI_60_INTERFACE_AGE}" diff --git a/guile18/HACKING b/guile18/HACKING new file mode 100644 index 0000000000..f6d5185311 --- /dev/null +++ b/guile18/HACKING @@ -0,0 +1,339 @@ +-*-text-*- +Guile Hacking Guide +Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2008 Free software Foundation, Inc. + + Permission is granted to anyone to make or distribute verbatim copies + of this document as received, in any medium, provided that the + copyright notice and permission notice are preserved, + and that the distributor grants the recipient permission + for further redistribution as permitted by this notice. + + Permission is granted to distribute modified versions + of this document, or of portions of it, + under the above conditions, provided also that they + carry prominent notices stating who last changed them, + and that any new or changed statements about the activities + of the Free Software Foundation are approved by the Foundation. + + +What to Hack ========================================================= + +You can hack whatever you want, thank GNU. + +However, to see what others have indicated as their interest (and avoid +potential wasteful duplication of effort), see file TODO. Note that +the version you find may be out of date; a CVS checkout is recommended: +see below for details (see also the files ANON-CVS and SNAPSHOTS). + +It's also a good idea to join the guile-devel@gnu.org mailing list. +See http://www.gnu.org/software/guile/mail/mail.html for more info. + + +Hacking It Yourself ================================================== + +When Guile is obtained from Git, a few extra steps must be taken +before the usual configure, make, make install. You will need to have +up-to-date versions of the tools as listed below, correctly installed. + +Sometimes older or newer versions will work. (See below for versions +to avoid.) + +Then you must run the autogen.sh script, as described below. + +The same procedure can be used to regenerate the files in released +versions of Guile. In that case the headers of the original generated +files (e.g., configure, Makefile.in, ltmain.sh) can be used to +identify which tool versions may be required. + +Autoconf --- a system for automatically generating `configure' + scripts from templates which list the non-portable features a + program would like to use. Available in + "ftp://ftp.gnu.org/pub/gnu/autoconf" + +Automake --- a system for automatically generating Makefiles that + conform to the (rather Byzantine) GNU coding standards. The + nice thing is that it takes care of hairy targets like 'make + dist' and 'make distclean', and automatically generates + Makefile dependencies. Automake is available in + "ftp://ftp.gnu.org/pub/gnu/automake" + +libtool --- a system for managing the zillion hairy options needed + on various systems to produce shared libraries. Available in + "ftp://ftp.gnu.org/pub/gnu/libtool". Version 1.5.26 (or + later) is needed for correct AIX support. + +gettext --- a system for rigging a program so that it can output its + messages in the local tongue. Guile presently only exports + the gettext functionality to Scheme, it does not use it + itself. + +flex --- a scanner generator. It's probably not essential to have the + latest version. + +One false move and you will be lost in a little maze of automatically +generated files, all different. + +Here is the authoritative list of tool/version/platform tuples that +have been known to cause problems, and a short description of the problem. + +- automake 1.4 adds extraneous rules to the top-level Makefile if + you specify specific Makefiles to rebuild on the command line. + +- automake 1.4-p4 (debian "1:1.4-p4-1.1") all platforms + automake "include" facility does not recognize filenames w/ "-". + +- libtool 1.4 uses acconfig.h, which is deprecated by newest autoconf + (which constructs the equivalent through 3rd arg of AC_DEFINE forms). + +- autoreconf from autoconf prior to 2.59 will run gettextize, which + will mess up the Guile tree. + +- (add here.) + + +Sample GDB Initialization File========================================= + +Here is a sample .gdbinit posted by Bill Schottstaedt (modified to +use `set' instead of `call' in some places): + + define gp + set gdb_print($arg0) + print gdb_output + end + document gp + Executes (object->string arg) + end + + define ge + call gdb_read($arg0) + call gdb_eval(gdb_result) + set gdb_print(gdb_result) + print gdb_output + end + document ge + Executes (print (eval (read arg))): ge "(+ 1 2)" => 3 + end + + define gh + call g_help(scm_str2symbol($arg0), 20) + set gdb_print($1) + print gdb_output + end + document gh + Prints help string for arg: gh "enved-target" + end + +Bill further writes: + + so in gdb if you see something useless like: + + #32 0x081ae8f4 in scm_primitive_load (filename=1112137128) at load.c:129 + + You can get the file name with gp: + + (gdb) gp 1112137128 + $1 = 0x40853fac "\"/home/bil/test/share/guile/1.5.0/ice-9/session.scm\"" + + +Contributing Your Changes ============================================ + +- If you have put together a change that meets the coding standards +described below, we encourage you to submit it to Guile. Post your +patch to guile-devel@gnu.org. + +- We prefer patches generated using 'git format-patch'. + +- Provide a description in the commit message, like so: + + 1-line description of change + + More extensive discussion of your change. Document why you are + changing things. + + * filename (function name): file specific change comments. + +- For proper credit, also make sure you update the AUTHORS file +(for new files for which you've assigned copyright to the FSF), or +the THANKS file (for everything else). + + +Coding standards ===================================================== + +- As for any part of Project GNU, changes to Guile should follow the +GNU coding standards. The standards are available via anonymous FTP +from prep.ai.mit.edu, as /pub/gnu/standards/standards.texi and +make-stds.texi. + +- The Guile tree should compile without warnings under the following +GCC switches, which are the default in the current configure script: + + -O2 -Wall -Wpointer-arith -Wmissing-prototypes + +To make sure of this, you can use the --enable-error-on-warning option +to configure. This option will make GCC fail if it hits a warning. + +Note that the warnings generated vary from one version of GCC to the +next, and from one architecture to the next (apparently). To provide +a concrete common standard, Guile should compile without warnings from +GCC 2.7.2.3 in a Red Hat 5.2 i386 Linux machine. Furthermore, each +developer should pursue any additional warnings noted by on their +compiler. This means that people using more stringent compilers will +have more work to do, and assures that everyone won't switch to the +most lenient compiler they can find. :) + +- If you add code which uses functions or other features that are not +entirely portable, please make sure the rest of Guile will still +function properly on systems where they are missing. This usually +entails adding a test to configure.in, and then adding #ifdefs to your +code to disable it if the system's features are missing. + +- The normal way of removing a function, macro or variable is to mark +it as "deprecated", keep it for a while, and remove it in a later +release. If a function or macro is marked as "deprecated" it +indicates that people shouldn't use it in new programs, and should try +to remove it in old. Make sure that an alternative exists unless it +is our purpose to remove functionality. Don't deprecate definitions +if it is unclear when they will be removed. (This is to ensure that a +valid way of implementing some functionality always exists.) + +When deprecating a definition, always follow this procedure: + +1. Mark the definition using + + #if (SCM_DEBUG_DEPRECATED == 0) + ... + #endif + + or, for Scheme code, wrap it using + + (begin-deprecated + ...) + +2. Make the deprecated code issue a warning when it is used, by using + scm_c_issue_deprecation_warning (in C) or issue-deprecation-warning + (in Scheme). + +3. Write a comment at the definition explaining how a programmer can + manage without the deprecated definition. + +4. Add an entry that the definition has been deprecated in NEWS and + explain what do do instead. + +5. In file TODO, there is a list of releases with reminders about what + to do at each release. Add a reminder about the removal of the + deprecated defintion at the appropriate release. + +- Write commit messages for functions written in C using the +functions' C names, and write entries for functions written in Scheme +using the functions' Scheme names. For example, + + * foo.c: Moved scm_procedure_documentation from eval.c. + +is preferred over + + * foo.c: Moved procedure-documentation from eval.c. + +Changes like adding this line are special: + + SCM_PROC (s_map_in_order, "map-in-order", 2, 0, 1, scm_map); + +Since the change here is about the name itself --- we're adding a new +alias for scm_map that guarantees the order in which we process list +elements, but we're not changing scm_map at all --- it's appropriate +to use the Scheme name in the commit message. + +- Make sure you have papers from people before integrating their +changes or contributions. This is very frustrating, but very +important to do right. From maintain.texi, "Information for +Maintainers of GNU Software": + + When incorporating changes from other people, make sure to follow the + correct procedures. Doing this ensures that the FSF has the legal + right to distribute and defend GNU software. + + For the sake of registering the copyright on later versions ofthe + software you need to keep track of each person who makes significant + changes. A change of ten lines or so, or a few such changes, in a + large program is not significant. + + *Before* incorporating significant changes, make sure that the person + has signed copyright papers, and that the Free Software Foundation has + received them. + +If you receive contributions you want to use from someone, let me know +and I'll take care of the administrivia. Put the contributions aside +until we have the necessary papers. + +Once you accept a contribution, be sure to keep the files AUTHORS and +THANKS uptodate. + +- When you make substantial changes to a file, add the current year to +the list of years in the copyright notice at the top of the file. + +- When you get bug reports or patches from people, be sure to list +them in THANKS. + + +Naming conventions ================================================= + +We use certain naming conventions to structure the considerable number +of global identifiers. All identifiers should be either all lower +case or all upper case. Syllables are separated by underscores `_'. +All non-static identifiers should start with scm_ or SCM_. Then might +follow zero or more syllables giving the category of the identifier. +The currently used category identifiers are + + t - type name + + c,C - something with a interface suited for C use. This is used + to name functions that behave like Scheme primitives but + have a more C friendly calling convention. + + i,I - internal to libguile. It is global, but not considered part + of the libguile API. + + f - a SCM variable pointing to a Scheme function object. + + F - a bit mask for a flag. + + m - a macro transformer procedure + + n,N - a count of something + + s - a constant C string + + k - a SCM variable pointing to a keyword. + + sym - a SCM variable pointing to a symbol. + + var - a SCM variable pointing to a variable object. + +The follwing syllables also have a technical meaning: + + str - this denotes a zero terminated C string + + mem - a C string with an explicit count + + +See also the file `devel/names.text'. + + +Helpful hints ======================================================== + +- [From Mikael Djurfeldt] When working on the Guile internals, it is +quite often practical to implement a scheme-level procedure which +helps you examine the feature you're working on. + +Examples of such procedures are: pt-size, debug-hand and +current-pstate. + +I've now put #ifdef GUILE_DEBUG around all such procedures, so that +they are not compiled into the "normal" Guile library. Please do the +same when you add new procedures/C functions for debugging purpose. + +You can define the GUILE_DEBUG flag by passing --enable-guile-debug to +the configure script. + + +Jim Blandy, and others + diff --git a/guile18/LICENSE b/guile18/LICENSE new file mode 100644 index 0000000000..dda451e613 --- /dev/null +++ b/guile18/LICENSE @@ -0,0 +1,2 @@ +Guile is covered under the terms of the GNU Lesser General Public +License, version 2.1 or later. See COPYING.LESSER. diff --git a/guile18/Makefile.am b/guile18/Makefile.am new file mode 100644 index 0000000000..1193b0c270 --- /dev/null +++ b/guile18/Makefile.am @@ -0,0 +1,46 @@ +## Process this file with automake to produce Makefile.in. +## +## Copyright (C) 1998, 1999, 2000, 2001, 2002, 2006, 2007, 2008 Free Software Foundation, Inc. +## +## This file is part of GUILE. +## +## GUILE is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as +## published by the Free Software Foundation; either version 2, or +## (at your option) any later version. +## +## GUILE is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public +## License along with GUILE; see the file COPYING. If not, write +## to the Free Software Foundation, Inc., 51 Franklin Street, Fifth +## Floor, Boston, MA 02110-1301 USA + +# want automake 1.10 or higher so that AM_GNU_GETTEXT can tell automake that +# config.rpath is needed +# +AUTOMAKE_OPTIONS = 1.10 + +SUBDIRS = oop libguile ice-9 guile-config guile-readline emacs \ + scripts srfi doc examples test-suite benchmark-suite lang am + +bin_SCRIPTS = guile-tools + +include_HEADERS = libguile.h + +EXTRA_DIST = LICENSE HACKING GUILE-VERSION guile-1.8.pc.in \ + ChangeLog-2008 m4/autobuild.m4 + +TESTS = check-guile + +ACLOCAL_AMFLAGS = -I m4 + +DISTCLEANFILES = check-guile.log + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = guile-1.8.pc + +# Makefile.am ends here diff --git a/guile18/NEWS b/guile18/NEWS new file mode 100644 index 0000000000..9fce2152b1 --- /dev/null +++ b/guile18/NEWS @@ -0,0 +1,7432 @@ +Guile NEWS --- history of user-visible changes. +Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +See the end for copying conditions. + +Please send Guile bug reports to bug-guile@gnu.org. + + +Changes in 1.8.8 (since 1.8.7) + +* Bugs fixed + +** Fix possible buffer overruns when parsing numbers +** Fix random number generator on 64-bit platforms + +Previously the `scm_c_random' function would crash or return only 32-bit +worth of randomness. In addition, the new `scm_c_random64' function +explicitly returns 64 bits of randomness. + +** Add missing range checks in `vector-move-left!' and `vector-move-right!' + +Previously these procedures could write past the end of a vector. + +** Avoid clash with system setjmp/longjmp on IA64 +** Don't dynamically link an extension that is already registered +** Fix `wrong type arg' exceptions with IPv6 addresses +** Fix typos in `(srfi srfi-19)' +** Have `(srfi srfi-35)' provide named struct vtables +** Fix C documentation extraction ("snarfing") with recent GCC versions +** Fix some Interix build problems +** Fix Tru64 build problems +** Fix GC-related build issues on Solaris 10 x86 with Sun Studio 12 +** Several small documentation fixes + + +Changes in 1.8.7 (since 1.8.6) + +* Bugs fixed + +** Fix compilation with `--disable-deprecated' +** Fix %fast-slot-ref/set!, to avoid possible segmentation fault +** Fix MinGW build problem caused by HAVE_STRUCT_TIMESPEC confusion +** Fix build problem when scm_t_timespec is different from struct timespec +** Fix build when compiled with -Wundef -Werror +** More build fixes for `alphaev56-dec-osf5.1b' (Tru64) +** Build fixes for `powerpc-ibm-aix5.3.0.0' (AIX 5.3) +** With GCC, always compile with `-mieee' on `alpha*' and `sh*' +** Better diagnose broken `(strftime "%z" ...)' in `time.test' (bug #24130) +** Fix parsing of SRFI-88/postfix keywords longer than 128 characters +** Fix reading of complex numbers where both parts are inexact decimals + +** Allow @ macro to work with (ice-9 syncase) + +Previously, use of the @ macro in a module whose code is being +transformed by (ice-9 syncase) would cause an "Invalid syntax" error. +Now it works as you would expect (giving the value of the specified +module binding). + +** Have `scm_take_locale_symbol ()' return an interned symbol (bug #25865) +** Fix potential deadlocks when running on multiple threads + +** Fix problems building with the i586-mingw32msvc cross-compiler + +It's now possible to build Guile for Windows by using the +i586-mingw32msvc cross-compiler on GNU/Linux. This kind of build +produces DLLs and a main program that can be copied to and used on a +Windows PC. For how to do this, see the `Cross building Guile' +section in `README'. + + +Changes in 1.8.6 (since 1.8.5) + +* New features (see the manual for details) + +** New convenience function `scm_c_symbol_length ()' + +** Single stepping through code from Emacs + +When you use GDS to evaluate Scheme code from Emacs, you can now use +`C-u' to indicate that you want to single step through that code. See +`Evaluating Scheme Code' in the manual for more details. + +** New "guile(1)" man page! + +* Changes to the distribution + +** Automake's `AM_MAINTAINER_MODE' is no longer used + +Thus, the `--enable-maintainer-mode' configure option is no longer +available: Guile is now always configured in "maintainer mode". + +** `ChangeLog' files are no longer updated + +Instead, changes are detailed in the version control system's logs. See +the top-level `ChangeLog' files for details. + + +* Bugs fixed + +** `symbol->string' now returns a read-only string, as per R5RS +** Fix incorrect handling of the FLAGS argument of `fold-matches' +** `guile-config link' now prints `-L$libdir' before `-lguile' +** Fix memory corruption involving GOOPS' `class-redefinition' +** Fix possible deadlock in `mutex-lock' +** Fix build issue on Tru64 and ia64-hp-hpux11.23 (`SCM_UNPACK' macro) +** Fix build issue on mips, mipsel, powerpc and ia64 (stack direction) +** Fix build issue on hppa2.0w-hp-hpux11.11 (`dirent64' and `readdir64_r') +** Fix build issue on i386-unknown-freebsd7.0 ("break strict-aliasing rules") +** Fix misleading output from `(help rationalize)' +** Fix build failure on Debian hppa architecture (bad stack growth detection) +** Fix `gcd' when called with a single, negative argument. +** Fix `Stack overflow' errors seen when building on some platforms +** Fix bug when `scm_with_guile ()' was called several times from the + same thread +** The handler of SRFI-34 `with-exception-handler' is now invoked in the + dynamic environment of the call to `raise' +** Fix potential deadlock in `make-struct' +** Fix compilation problem with libltdl from Libtool 2.2.x +** Fix sloppy bound checking in `string-{ref,set!}' with the empty string + + +Changes in 1.8.5 (since 1.8.4) + +* Infrastructure changes + +** Guile repository switched from CVS to Git + +The new repository can be accessed using +"git-clone git://git.sv.gnu.org/guile.git", or can be browsed on-line at +http://git.sv.gnu.org/gitweb/?p=guile.git . See `README' for details. + +** Add support for `pkg-config' + +See "Autoconf Support" in the manual for details. + +* New modules (see the manual for details) + +** `(srfi srfi-88)' + +* New features (see the manual for details) + +** New `postfix' read option, for SRFI-88 keyword syntax +** Some I/O primitives have been inlined, which improves I/O performance +** New object-based traps infrastructure + +This is a GOOPS-based infrastructure that builds on Guile's low-level +evaluator trap calls and facilitates the development of debugging +features like single-stepping, breakpoints, tracing and profiling. +See the `Traps' node of the manual for details. + +** New support for working on Guile code from within Emacs + +Guile now incorporates the `GDS' library (previously distributed +separately) for working on Guile code from within Emacs. See the +`Using Guile In Emacs' node of the manual for details. + +* Bugs fixed + +** `scm_add_slot ()' no longer segfaults (fixes bug #22369) +** Fixed `(ice-9 match)' for patterns like `((_ ...) ...)' + +Previously, expressions like `(match '((foo) (bar)) (((_ ...) ...) #t))' +would trigger an unbound variable error for `match:andmap'. + +** `(oop goops describe)' now properly provides the `describe' feature +** Fixed `args-fold' from `(srfi srfi-37)' + +Previously, parsing short option names of argument-less options would +lead to a stack overflow. + +** `(srfi srfi-35)' is now visible through `cond-expand' +** Fixed type-checking for the second argument of `eval' +** Fixed type-checking for SRFI-1 `partition' +** Fixed `struct-ref' and `struct-set!' on "light structs" +** Honor struct field access rights in GOOPS +** Changed the storage strategy of source properties, which fixes a deadlock +** Allow compilation of Guile-using programs in C99 mode with GCC 4.3 and later +** Fixed build issue for GNU/Linux on IA64 +** Fixed build issues on NetBSD 1.6 +** Fixed build issue on Solaris 2.10 x86_64 +** Fixed build issue with DEC/Compaq/HP's compiler +** Fixed `scm_from_complex_double' build issue on FreeBSD +** Fixed `alloca' build issue on FreeBSD 6 +** Removed use of non-portable makefile constructs +** Fixed shadowing of libc's on Tru64, which broke compilation +** Make sure all tests honor `$TMPDIR' + + +Changes in 1.8.4 (since 1.8.3) + +* Bugs fixed + +** CR (ASCII 0x0d) is (again) recognized as a token delimiter by the reader +** Fixed a segmentation fault which occurred when displaying the +backtrace of a stack with a promise object (made by `delay') in it. +** Make `accept' leave guile mode while blocking +** `scm_c_read ()' and `scm_c_write ()' now type-check their port argument +** Fixed a build problem on AIX (use of func_data identifier) +** Fixed a segmentation fault which occurred when hashx-ref or hashx-set! was +called with an associator proc that returns neither a pair nor #f. +** Secondary threads now always return a valid module for (current-module). +** Avoid MacOS build problems caused by incorrect combination of "64" +system and library calls. +** `guile-snarf' now honors `$TMPDIR' +** `guile-config compile' now reports CPPFLAGS used at compile-time +** Fixed build with Sun Studio (Solaris 9) +** Fixed wrong-type-arg errors when creating zero length SRFI-4 +uniform vectors on AIX. +** Fixed a deadlock that occurs upon GC with multiple threads. +** Fixed compile problem with GCC on Solaris and AIX (use of _Complex_I) +** Fixed autotool-derived build problems on AIX 6.1. +** Fixed NetBSD/alpha support +** Fixed MacOS build problem caused by use of rl_get_keymap(_name) + +* New modules (see the manual for details) + +** `(srfi srfi-69)' + +* Documentation fixes and improvements + +** Removed premature breakpoint documentation + +The features described are not available in the series of 1.8.x +releases, so the documentation was misleading and has been removed. + +** More about Guile's default *random-state* variable + +** GOOPS: more about how to use `next-method' + +* Changes to the distribution + +** Corrected a few files that referred incorrectly to the old GPL + special exception licence + +In fact Guile since 1.8.0 has been licensed with the GNU Lesser +General Public License, and the few incorrect files have now been +fixed to agree with the rest of the Guile distribution. + +** Removed unnecessary extra copies of COPYING* + +The distribution now contains a single COPYING.LESSER at its top level. + + +Changes in 1.8.3 (since 1.8.2) + +* New modules (see the manual for details) + +** `(srfi srfi-35)' +** `(srfi srfi-37)' + +* Bugs fixed + +** The `(ice-9 slib)' module now works as expected +** Expressions like "(set! 'x #t)" no longer yield a crash +** Warnings about duplicate bindings now go to stderr +** A memory leak in `make-socket-address' was fixed +** Alignment issues (e.g., on SPARC) in network routines were fixed +** A threading issue that showed up at least on NetBSD was fixed +** Build problems on Solaris and IRIX fixed + +* Implementation improvements + +** The reader is now faster, which reduces startup time +** Procedures returned by `record-accessor' and `record-modifier' are faster + + +Changes in 1.8.2 (since 1.8.1): + +* New procedures (see the manual for details) + +** set-program-arguments +** make-vtable + +* Incompatible changes + +** The body of a top-level `define' no longer sees the binding being created + +In a top-level `define', the binding being created is no longer visible +from the `define' body. This breaks code like +"(define foo (begin (set! foo 1) (+ foo 1)))", where `foo' is now +unbound in the body. However, such code was not R5RS-compliant anyway, +per Section 5.2.1. + +* Bugs fixed + +** Fractions were not `equal?' if stored in unreduced form. +(A subtle problem, since printing a value reduced it, making it work.) +** srfi-60 `copy-bit' failed on 64-bit systems +** "guile --use-srfi" option at the REPL can replace core functions +(Programs run with that option were ok, but in the interactive REPL +the core bindings got priority, preventing SRFI replacements or +extensions.) +** `regexp-exec' doesn't abort() on #\nul in the input or bad flags arg +** `kill' on mingw throws an error for a PID other than oneself +** Procedure names are attached to procedure-with-setters +** Array read syntax works with negative lower bound +** `array-in-bounds?' fix if an array has different lower bounds on each index +** `*' returns exact 0 for "(* inexact 0)" +This follows what it always did for "(* 0 inexact)". +** SRFI-19: Value returned by `(current-time time-process)' was incorrect +** SRFI-19: `date->julian-day' did not account for timezone offset +** `ttyname' no longer crashes when passed a non-tty argument +** `inet-ntop' no longer crashes on SPARC when passed an `AF_INET' address +** Small memory leaks have been fixed in `make-fluid' and `add-history' +** GOOPS: Fixed a bug in `method-more-specific?' +** Build problems on Solaris fixed +** Build problems on HP-UX IA64 fixed +** Build problems on MinGW fixed + + +Changes in 1.8.1 (since 1.8.0): + +* LFS functions are now used to access 64-bit files on 32-bit systems. + +* New procedures (see the manual for details) + +** primitive-_exit - [Scheme] the-root-module +** scm_primitive__exit - [C] +** make-completion-function - [Scheme] (ice-9 readline) +** scm_c_locale_stringn_to_number - [C] +** scm_srfi1_append_reverse [C] +** scm_srfi1_append_reverse_x [C] +** scm_log - [C] +** scm_log10 - [C] +** scm_exp - [C] +** scm_sqrt - [C] + +* Bugs fixed + +** Build problems have been fixed on MacOS, SunOS, and QNX. + +** `strftime' fix sign of %z timezone offset. + +** A one-dimensional array can now be 'equal?' to a vector. + +** Structures, records, and SRFI-9 records can now be compared with `equal?'. + +** SRFI-14 standard char sets are recomputed upon a successful `setlocale'. + +** `record-accessor' and `record-modifier' now have strict type checks. + +Record accessor and modifier procedures now throw an error if the +record type of the record they're given is not the type expected. +(Previously accessors returned #f and modifiers silently did nothing). + +** It is now OK to use both autoload and use-modules on a given module. + +** `apply' checks the number of arguments more carefully on "0 or 1" funcs. + +Previously there was no checking on primatives like make-vector that +accept "one or two" arguments. Now there is. + +** The srfi-1 assoc function now calls its equality predicate properly. + +Previously srfi-1 assoc would call the equality predicate with the key +last. According to the SRFI, the key should be first. + +** A bug in n-par-for-each and n-for-each-par-map has been fixed. + +** The array-set! procedure no longer segfaults when given a bit vector. + +** Bugs in make-shared-array have been fixed. + +** stringinexact should no longer overflow when given certain large fractions. + +** srfi-9 accessor and modifier procedures now have strict record type checks. + +This matches the srfi-9 specification. + +** (ice-9 ftw) procedures won't ignore different files with same inode number. + +Previously the (ice-9 ftw) procedures would ignore any file that had +the same inode number as a file they had already seen, even if that +file was on a different device. + + +Changes in 1.8.0 (changes since the 1.6.x series): + +* Changes to the distribution + +** Guile is now licensed with the GNU Lesser General Public License. + +** The manual is now licensed with the GNU Free Documentation License. + +** Guile now requires GNU MP (http://swox.com/gmp). + +Guile now uses the GNU MP library for arbitrary precision arithmetic. + +** Guile now has separate private and public configuration headers. + +That is, things like HAVE_STRING_H no longer leak from Guile's +headers. + +** Guile now provides and uses an "effective" version number. + +Guile now provides scm_effective_version and effective-version +functions which return the "effective" version number. This is just +the normal full version string without the final micro-version number, +so the current effective-version is "1.8". The effective version +should remain unchanged during a stable series, and should be used for +items like the versioned share directory name +i.e. /usr/share/guile/1.8. + +Providing an unchanging version number during a stable release for +things like the versioned share directory can be particularly +important for Guile "add-on" packages, since it provides a directory +that they can install to that won't be changed out from under them +with each micro release during a stable series. + +** Thread implementation has changed. + +When you configure "--with-threads=null", you will get the usual +threading API (call-with-new-thread, make-mutex, etc), but you can't +actually create new threads. Also, "--with-threads=no" is now +equivalent to "--with-threads=null". This means that the thread API +is always present, although you might not be able to create new +threads. + +When you configure "--with-threads=pthreads" or "--with-threads=yes", +you will get threads that are implemented with the portable POSIX +threads. These threads can run concurrently (unlike the previous +"coop" thread implementation), but need to cooperate for things like +the GC. + +The default is "pthreads", unless your platform doesn't have pthreads, +in which case "null" threads are used. + +See the manual for details, nodes "Initialization", "Multi-Threading", +"Blocking", and others. + +** There is the new notion of 'discouraged' features. + +This is a milder form of deprecation. + +Things that are discouraged should not be used in new code, but it is +OK to leave them in old code for now. When a discouraged feature is +used, no warning message is printed like there is for 'deprecated' +features. Also, things that are merely discouraged are nevertheless +implemented efficiently, while deprecated features can be very slow. + +You can omit discouraged features from libguile by configuring it with +the '--disable-discouraged' option. + +** Deprecation warnings can be controlled at run-time. + +(debug-enable 'warn-deprecated) switches them on and (debug-disable +'warn-deprecated) switches them off. + +** Support for SRFI 61, extended cond syntax for multiple values has + been added. + +This SRFI is always available. + +** Support for require-extension, SRFI-55, has been added. + +The SRFI-55 special form `require-extension' has been added. It is +available at startup, and provides a portable way to load Scheme +extensions. SRFI-55 only requires support for one type of extension, +"srfi"; so a set of SRFIs may be loaded via (require-extension (srfi 1 +13 14)). + +** New module (srfi srfi-26) provides support for `cut' and `cute'. + +The (srfi srfi-26) module is an implementation of SRFI-26 which +provides the `cut' and `cute' syntax. These may be used to specialize +parameters without currying. + +** New module (srfi srfi-31) + +This is an implementation of SRFI-31 which provides a special form +`rec' for recursive evaluation. + +** The modules (srfi srfi-13), (srfi srfi-14) and (srfi srfi-4) have + been merged with the core, making their functionality always + available. + +The modules are still available, tho, and you could use them together +with a renaming import, for example. + +** Guile no longer includes its own version of libltdl. + +The official version is good enough now. + +** The --enable-htmldoc option has been removed from 'configure'. + +Support for translating the documentation into HTML is now always +provided. Use 'make html'. + +** New module (ice-9 serialize): + +(serialize FORM1 ...) and (parallelize FORM1 ...) are useful when you +don't trust the thread safety of most of your program, but where you +have some section(s) of code which you consider can run in parallel to +other sections. See ice-9/serialize.scm for more information. + +** The configure option '--disable-arrays' has been removed. + +Support for arrays and uniform numeric arrays is now always included +in Guile. + +* Changes to the stand-alone interpreter + +** New command line option `-L'. + +This option adds a directory to the front of the load path. + +** New command line option `--no-debug'. + +Specifying `--no-debug' on the command line will keep the debugging +evaluator turned off, even for interactive sessions. + +** User-init file ~/.guile is now loaded with the debugging evaluator. + +Previously, the normal evaluator would have been used. Using the +debugging evaluator gives better error messages. + +** The '-e' option now 'read's its argument. + +This is to allow the new '(@ MODULE-NAME VARIABLE-NAME)' construct to +be used with '-e'. For example, you can now write a script like + + #! /bin/sh + exec guile -e '(@ (demo) main)' -s "$0" "$@" + !# + + (define-module (demo) + :export (main)) + + (define (main args) + (format #t "Demo: ~a~%" args)) + + +* Changes to Scheme functions and syntax + +** Guardians have changed back to their original semantics + +Guardians now behave like described in the paper by Dybvig et al. In +particular, they no longer make guarantees about the order in which +they return objects, and they can no longer be greedy. + +They no longer drop cyclic data structures. + +The C function scm_make_guardian has been changed incompatibly and no +longer takes the 'greedy_p' argument. + +** New function hashx-remove! + +This function completes the set of 'hashx' functions. + +** The concept of dynamic roots has been factored into continuation + barriers and dynamic states. + +Each thread has a current dynamic state that carries the values of the +fluids. You can create and copy dynamic states and use them as the +second argument for 'eval'. See "Fluids and Dynamic States" in the +manual. + +To restrict the influence that captured continuations can have on the +control flow, you can errect continuation barriers. See "Continuation +Barriers" in the manual. + +The function call-with-dynamic-root now essentially temporarily +installs a new dynamic state and errects a continuation barrier. + +** The default load path no longer includes "." at the end. + +Automatically loading modules from the current directory should not +happen by default. If you want to allow it in a more controlled +manner, set the environment variable GUILE_LOAD_PATH or the Scheme +variable %load-path. + +** The uniform vector and array support has been overhauled. + +It now complies with SRFI-4 and the weird prototype based uniform +array creation has been deprecated. See the manual for more details. + +Some non-compatible changes have been made: + - characters can no longer be stored into byte arrays. + - strings and bit vectors are no longer considered to be uniform numeric + vectors. + - array-rank throws an error for non-arrays instead of returning zero. + - array-ref does no longer accept non-arrays when no indices are given. + +There is the new notion of 'generalized vectors' and corresponding +procedures like 'generalized-vector-ref'. Generalized vectors include +strings, bitvectors, ordinary vectors, and uniform numeric vectors. + +Arrays use generalized vectors as their storage, so that you still +have arrays of characters, bits, etc. However, uniform-array-read! +and uniform-array-write can no longer read/write strings and +bitvectors. + +** There is now support for copy-on-write substrings, mutation-sharing + substrings and read-only strings. + +Three new procedures are related to this: substring/shared, +substring/copy, and substring/read-only. See the manual for more +information. + +** Backtraces will now highlight the value that caused the error. + +By default, these values are enclosed in "{...}", such as in this +example: + + guile> (car 'a) + + Backtrace: + In current input: + 1: 0* [car {a}] + + :1:1: In procedure car in expression (car (quote a)): + :1:1: Wrong type (expecting pair): a + ABORT: (wrong-type-arg) + +The prefix and suffix used for highlighting can be set via the two new +printer options 'highlight-prefix' and 'highlight-suffix'. For +example, putting this into ~/.guile will output the bad value in bold +on an ANSI terminal: + + (print-set! highlight-prefix "\x1b[1m") + (print-set! highlight-suffix "\x1b[22m") + + +** 'gettext' support for internationalization has been added. + +See the manual for details. + +** New syntax '@' and '@@': + +You can now directly refer to variables exported from a module by +writing + + (@ MODULE-NAME VARIABLE-NAME) + +For example (@ (ice-9 pretty-print) pretty-print) will directly access +the pretty-print variable exported from the (ice-9 pretty-print) +module. You don't need to 'use' that module first. You can also use +'@' as a target of 'set!', as in (set! (@ mod var) val). + +The related syntax (@@ MODULE-NAME VARIABLE-NAME) works just like '@', +but it can also access variables that have not been exported. It is +intended only for kluges and temporary fixes and for debugging, not +for ordinary code. + +** Keyword syntax has been made more disciplined. + +Previously, the name of a keyword was read as a 'token' but printed as +a symbol. Now, it is read as a general Scheme datum which must be a +symbol. + +Previously: + + guile> #:12 + #:#{12}# + guile> #:#{12}# + #:#{\#{12}\#}# + guile> #:(a b c) + #:#{}# + ERROR: In expression (a b c): + Unbound variable: a + guile> #: foo + #:#{}# + ERROR: Unbound variable: foo + +Now: + + guile> #:12 + ERROR: Wrong type (expecting symbol): 12 + guile> #:#{12}# + #:#{12}# + guile> #:(a b c) + ERROR: Wrong type (expecting symbol): (a b c) + guile> #: foo + #:foo + +** The printing of symbols that might look like keywords can be + controlled. + +The new printer option 'quote-keywordish-symbols' controls how symbols +are printed that have a colon as their first or last character. The +default now is to only quote a symbol with #{...}# when the read +option 'keywords' is not '#f'. Thus: + + guile> (define foo (string->symbol ":foo")) + guile> (read-set! keywords #f) + guile> foo + :foo + guile> (read-set! keywords 'prefix) + guile> foo + #{:foo}# + guile> (print-set! quote-keywordish-symbols #f) + guile> foo + :foo + +** 'while' now provides 'break' and 'continue' + +break and continue were previously bound in a while loop, but not +documented, and continue didn't quite work properly. The undocumented +parameter to break which gave a return value for the while has been +dropped. + +** 'call-with-current-continuation' is now also available under the name + 'call/cc'. + +** The module system now checks for duplicate bindings. + +The module system now can check for name conflicts among imported +bindings. + +The behavior can be controlled by specifying one or more 'duplicates' +handlers. For example, to make Guile return an error for every name +collision, write: + +(define-module (foo) + :use-module (bar) + :use-module (baz) + :duplicates check) + +The new default behavior of the module system when a name collision +has been detected is to + + 1. Give priority to bindings marked as a replacement. + 2. Issue a warning (different warning if overriding core binding). + 3. Give priority to the last encountered binding (this corresponds to + the old behavior). + +If you want the old behavior back without replacements or warnings you +can add the line: + + (default-duplicate-binding-handler 'last) + +to your .guile init file. + +** New define-module option: :replace + +:replace works as :export, but, in addition, marks the binding as a +replacement. + +A typical example is `format' in (ice-9 format) which is a replacement +for the core binding `format'. + +** Adding prefixes to imported bindings in the module system + +There is now a new :use-module option :prefix. It can be used to add +a prefix to all imported bindings. + + (define-module (foo) + :use-module ((bar) :prefix bar:)) + +will import all bindings exported from bar, but rename them by adding +the prefix `bar:'. + +** Conflicting generic functions can be automatically merged. + +When two imported bindings conflict and they are both generic +functions, the two functions can now be merged automatically. This is +activated with the 'duplicates' handler 'merge-generics'. + +** New function: effective-version + +Returns the "effective" version number. This is just the normal full +version string without the final micro-version number. See "Changes +to the distribution" above. + +** New threading functions: parallel, letpar, par-map, and friends + +These are convenient ways to run calculations in parallel in new +threads. See "Parallel forms" in the manual for details. + +** New function 'try-mutex'. + +This function will attempt to lock a mutex but will return immediately +instead of blocking and indicate failure. + +** Waiting on a condition variable can have a timeout. + +The function 'wait-condition-variable' now takes a third, optional +argument that specifies the point in time where the waiting should be +aborted. + +** New function 'broadcast-condition-variable'. + +** New functions 'all-threads' and 'current-thread'. + +** Signals and system asyncs work better with threads. + +The function 'sigaction' now takes a fourth, optional, argument that +specifies the thread that the handler should run in. When the +argument is omitted, the handler will run in the thread that called +'sigaction'. + +Likewise, 'system-async-mark' takes a second, optional, argument that +specifies the thread that the async should run in. When it is +omitted, the async will run in the thread that called +'system-async-mark'. + +C code can use the new functions scm_sigaction_for_thread and +scm_system_async_mark_for_thread to pass the new thread argument. + +When a thread blocks on a mutex, a condition variable or is waiting +for IO to be possible, it will still execute system asyncs. This can +be used to interrupt such a thread by making it execute a 'throw', for +example. + +** The function 'system-async' is deprecated. + +You can now pass any zero-argument procedure to 'system-async-mark'. +The function 'system-async' will just return its argument unchanged +now. + +** New functions 'call-with-blocked-asyncs' and + 'call-with-unblocked-asyncs' + +The expression (call-with-blocked-asyncs PROC) will call PROC and will +block execution of system asyncs for the current thread by one level +while PROC runs. Likewise, call-with-unblocked-asyncs will call a +procedure and will unblock the execution of system asyncs by one +level for the current thread. + +Only system asyncs are affected by these functions. + +** The functions 'mask-signals' and 'unmask-signals' are deprecated. + +Use 'call-with-blocked-asyncs' or 'call-with-unblocked-asyncs' +instead. Those functions are easier to use correctly and can be +nested. + +** New function 'unsetenv'. + +** New macro 'define-syntax-public'. + +It works like 'define-syntax' and also exports the defined macro (but +only on top-level). + +** There is support for Infinity and NaNs. + +Following PLT Scheme, Guile can now work with infinite numbers, and +'not-a-numbers'. + +There is new syntax for numbers: "+inf.0" (infinity), "-inf.0" +(negative infinity), "+nan.0" (not-a-number), and "-nan.0" (same as +"+nan.0"). These numbers are inexact and have no exact counterpart. + +Dividing by an inexact zero returns +inf.0 or -inf.0, depending on the +sign of the dividend. The infinities are integers, and they answer #t +for both 'even?' and 'odd?'. The +nan.0 value is not an integer and is +not '=' to itself, but '+nan.0' is 'eqv?' to itself. + +For example + + (/ 1 0.0) + => +inf.0 + + (/ 0 0.0) + => +nan.0 + + (/ 0) + ERROR: Numerical overflow + +Two new predicates 'inf?' and 'nan?' can be used to test for the +special values. + +** Inexact zero can have a sign. + +Guile can now distinguish between plus and minus inexact zero, if your +platform supports this, too. The two zeros are equal according to +'=', but not according to 'eqv?'. For example + + (- 0.0) + => -0.0 + + (= 0.0 (- 0.0)) + => #t + + (eqv? 0.0 (- 0.0)) + => #f + +** Guile now has exact rationals. + +Guile can now represent fractions such as 1/3 exactly. Computing with +them is also done exactly, of course: + + (* 1/3 3/2) + => 1/2 + +** 'floor', 'ceiling', 'round' and 'truncate' now return exact numbers + for exact arguments. + +For example: (floor 2) now returns an exact 2 where in the past it +returned an inexact 2.0. Likewise, (floor 5/4) returns an exact 1. + +** inexact->exact no longer returns only integers. + +Without exact rationals, the closest exact number was always an +integer, but now inexact->exact returns the fraction that is exactly +equal to a floating point number. For example: + + (inexact->exact 1.234) + => 694680242521899/562949953421312 + +When you want the old behavior, use 'round' explicitly: + + (inexact->exact (round 1.234)) + => 1 + +** New function 'rationalize'. + +This function finds a simple fraction that is close to a given real +number. For example (and compare with inexact->exact above): + + (rationalize (inexact->exact 1.234) 1/2000) + => 58/47 + +Note that, as required by R5RS, rationalize returns only then an exact +result when both its arguments are exact. + +** 'odd?' and 'even?' work also for inexact integers. + +Previously, (odd? 1.0) would signal an error since only exact integers +were recognized as integers. Now (odd? 1.0) returns #t, (odd? 2.0) +returns #f and (odd? 1.5) signals an error. + +** Guile now has uninterned symbols. + +The new function 'make-symbol' will return an uninterned symbol. This +is a symbol that is unique and is guaranteed to remain unique. +However, uninterned symbols can not yet be read back in. + +Use the new function 'symbol-interned?' to check whether a symbol is +interned or not. + +** pretty-print has more options. + +The function pretty-print from the (ice-9 pretty-print) module can now +also be invoked with keyword arguments that control things like +maximum output width. See the manual for details. + +** Variables have no longer a special behavior for `equal?'. + +Previously, comparing two variables with `equal?' would recursivly +compare their values. This is no longer done. Variables are now only +`equal?' if they are `eq?'. + +** `(begin)' is now valid. + +You can now use an empty `begin' form. It will yield # +when evaluated and simply be ignored in a definition context. + +** Deprecated: procedure->macro + +Change your code to use 'define-macro' or r5rs macros. Also, be aware +that macro expansion will not be done during evaluation, but prior to +evaluation. + +** Soft ports now allow a `char-ready?' procedure + +The vector argument to `make-soft-port' can now have a length of +either 5 or 6. (Previously the length had to be 5.) The optional 6th +element is interpreted as an `input-waiting' thunk -- i.e. a thunk +that returns the number of characters that can be read immediately +without the soft port blocking. + +** Deprecated: undefine + +There is no replacement for undefine. + +** The functions make-keyword-from-dash-symbol and keyword-dash-symbol + have been discouraged. + +They are relics from a time where a keyword like #:foo was used +directly as a Tcl option "-foo" and thus keywords were internally +stored as a symbol with a starting dash. We now store a symbol +without the dash. + +Use symbol->keyword and keyword->symbol instead. + +** The `cheap' debug option is now obsolete + +Evaluator trap calls are now unconditionally "cheap" - in other words, +they pass a debug object to the trap handler rather than a full +continuation. The trap handler code can capture a full continuation +by using `call-with-current-continuation' in the usual way, if it so +desires. + +The `cheap' option is retained for now so as not to break existing +code which gets or sets it, but setting it now has no effect. It will +be removed in the next major Guile release. + +** Evaluator trap calls now support `tweaking' + +`Tweaking' means that the trap handler code can modify the Scheme +expression that is about to be evaluated (in the case of an +enter-frame trap) or the value that is being returned (in the case of +an exit-frame trap). The trap handler code indicates that it wants to +do this by returning a pair whose car is the symbol 'instead and whose +cdr is the modified expression or return value. + +* Changes to the C interface + +** The functions scm_hash_fn_remove_x and scm_hashx_remove_x no longer + take a 'delete' function argument. + +This argument makes no sense since the delete function is used to +remove a pair from an alist, and this must not be configurable. + +This is an incompatible change. + +** The GH interface is now subject to the deprecation mechanism + +The GH interface has been deprecated for quite some time but now it is +actually removed from Guile when it is configured with +--disable-deprecated. + +See the manual "Transitioning away from GH" for more information. + +** A new family of functions for converting between C values and + Scheme values has been added. + +These functions follow a common naming scheme and are designed to be +easier to use, thread-safe and more future-proof than the older +alternatives. + + - int scm_is_* (...) + + These are predicates that return a C boolean: 1 or 0. Instead of + SCM_NFALSEP, you can now use scm_is_true, for example. + + - scm_to_ (SCM val, ...) + + These are functions that convert a Scheme value into an appropriate + C value. For example, you can use scm_to_int to safely convert from + a SCM to an int. + + - SCM scm_from_ ( val, ...) + + These functions convert from a C type to a SCM value; for example, + scm_from_int for ints. + +There is a huge number of these functions, for numbers, strings, +symbols, vectors, etc. They are documented in the reference manual in +the API section together with the types that they apply to. + +** New functions for dealing with complex numbers in C have been added. + +The new functions are scm_c_make_rectangular, scm_c_make_polar, +scm_c_real_part, scm_c_imag_part, scm_c_magnitude and scm_c_angle. +They work like scm_make_rectangular etc but take or return doubles +directly. + +** The function scm_make_complex has been discouraged. + +Use scm_c_make_rectangular instead. + +** The INUM macros have been deprecated. + +A lot of code uses these macros to do general integer conversions, +although the macros only work correctly with fixnums. Use the +following alternatives. + + SCM_INUMP -> scm_is_integer or similar + SCM_NINUMP -> !scm_is_integer or similar + SCM_MAKINUM -> scm_from_int or similar + SCM_INUM -> scm_to_int or similar + + SCM_VALIDATE_INUM_* -> Do not use these; scm_to_int, etc. will + do the validating for you. + +** The scm_num2 and scm_2num functions and scm_make_real + have been discouraged. + +Use the newer scm_to_ and scm_from_ functions instead for +new code. The functions have been discouraged since they don't fit +the naming scheme. + +** The 'boolean' macros SCM_FALSEP etc have been discouraged. + +They have strange names, especially SCM_NFALSEP, and SCM_BOOLP +evaluates its argument twice. Use scm_is_true, etc. instead for new +code. + +** The macro SCM_EQ_P has been discouraged. + +Use scm_is_eq for new code, which fits better into the naming +conventions. + +** The macros SCM_CONSP, SCM_NCONSP, SCM_NULLP, and SCM_NNULLP have + been discouraged. + +Use the function scm_is_pair or scm_is_null instead. + +** The functions scm_round and scm_truncate have been deprecated and + are now available as scm_c_round and scm_c_truncate, respectively. + +These functions occupy the names that scm_round_number and +scm_truncate_number should have. + +** The functions scm_c_string2str, scm_c_substring2str, and + scm_c_symbol2str have been deprecated. + +Use scm_to_locale_stringbuf or similar instead, maybe together with +scm_substring. + +** New functions scm_c_make_string, scm_c_string_length, + scm_c_string_ref, scm_c_string_set_x, scm_c_substring, + scm_c_substring_shared, scm_c_substring_copy. + +These are like scm_make_string, scm_length, etc. but are slightly +easier to use from C. + +** The macros SCM_STRINGP, SCM_STRING_CHARS, SCM_STRING_LENGTH, + SCM_SYMBOL_CHARS, and SCM_SYMBOL_LENGTH have been deprecated. + +They export too many assumptions about the implementation of strings +and symbols that are no longer true in the presence of +mutation-sharing substrings and when Guile switches to some form of +Unicode. + +When working with strings, it is often best to use the normal string +functions provided by Guile, such as scm_c_string_ref, +scm_c_string_set_x, scm_string_append, etc. Be sure to look in the +manual since many more such functions are now provided than +previously. + +When you want to convert a SCM string to a C string, use the +scm_to_locale_string function or similar instead. For symbols, use +scm_symbol_to_string and then work with that string. Because of the +new string representation, scm_symbol_to_string does not need to copy +and is thus quite efficient. + +** Some string, symbol and keyword functions have been discouraged. + +They don't fit into the uniform naming scheme and are not explicit +about the character encoding. + +Replace according to the following table: + + scm_allocate_string -> scm_c_make_string + scm_take_str -> scm_take_locale_stringn + scm_take0str -> scm_take_locale_string + scm_mem2string -> scm_from_locale_stringn + scm_str2string -> scm_from_locale_string + scm_makfrom0str -> scm_from_locale_string + scm_mem2symbol -> scm_from_locale_symboln + scm_mem2uninterned_symbol -> scm_from_locale_stringn + scm_make_symbol + scm_str2symbol -> scm_from_locale_symbol + + SCM_SYMBOL_HASH -> scm_hashq + SCM_SYMBOL_INTERNED_P -> scm_symbol_interned_p + + scm_c_make_keyword -> scm_from_locale_keyword + +** The functions scm_keyword_to_symbol and sym_symbol_to_keyword are + now also available to C code. + +** SCM_KEYWORDP and SCM_KEYWORDSYM have been deprecated. + +Use scm_is_keyword and scm_keyword_to_symbol instead, but note that +the latter returns the true name of the keyword, not the 'dash name', +as SCM_KEYWORDSYM used to do. + +** A new way to access arrays in a thread-safe and efficient way has + been added. + +See the manual, node "Accessing Arrays From C". + +** The old uniform vector and bitvector implementations have been + unceremoniously removed. + +This implementation exposed the details of the tagging system of +Guile. Use the new C API explained in the manual in node "Uniform +Numeric Vectors" and "Bit Vectors", respectively. + +The following macros are gone: SCM_UVECTOR_BASE, SCM_SET_UVECTOR_BASE, +SCM_UVECTOR_MAXLENGTH, SCM_UVECTOR_LENGTH, SCM_MAKE_UVECTOR_TAG, +SCM_SET_UVECTOR_LENGTH, SCM_BITVECTOR_P, SCM_BITVECTOR_BASE, +SCM_SET_BITVECTOR_BASE, SCM_BITVECTOR_MAX_LENGTH, +SCM_BITVECTOR_LENGTH, SCM_MAKE_BITVECTOR_TAG, +SCM_SET_BITVECTOR_LENGTH, SCM_BITVEC_REF, SCM_BITVEC_SET, +SCM_BITVEC_CLR. + +** The macros dealing with vectors have been deprecated. + +Use the new functions scm_is_vector, scm_vector_elements, +scm_vector_writable_elements, etc, or scm_is_simple_vector, +SCM_SIMPLE_VECTOR_REF, SCM_SIMPLE_VECTOR_SET, etc instead. See the +manual for more details. + +Deprecated are SCM_VECTORP, SCM_VELTS, SCM_VECTOR_MAX_LENGTH, +SCM_VECTOR_LENGTH, SCM_VECTOR_REF, SCM_VECTOR_SET, SCM_WRITABLE_VELTS. + +The following macros have been removed: SCM_VECTOR_BASE, +SCM_SET_VECTOR_BASE, SCM_MAKE_VECTOR_TAG, SCM_SET_VECTOR_LENGTH, +SCM_VELTS_AS_STACKITEMS, SCM_SETVELTS, SCM_GC_WRITABLE_VELTS. + +** Some C functions and macros related to arrays have been deprecated. + +Migrate according to the following table: + + scm_make_uve -> scm_make_typed_array, scm_make_u8vector etc. + scm_make_ra -> scm_make_array + scm_shap2ra -> scm_make_array + scm_cvref -> scm_c_generalized_vector_ref + scm_ra_set_contp -> do not use + scm_aind -> scm_array_handle_pos + scm_raprin1 -> scm_display or scm_write + + SCM_ARRAYP -> scm_is_array + SCM_ARRAY_NDIM -> scm_c_array_rank + SCM_ARRAY_DIMS -> scm_array_handle_dims + SCM_ARRAY_CONTP -> do not use + SCM_ARRAY_MEM -> do not use + SCM_ARRAY_V -> scm_array_handle_elements or similar + SCM_ARRAY_BASE -> do not use + +** SCM_CELL_WORD_LOC has been deprecated. + +Use the new macro SCM_CELL_OBJECT_LOC instead, which returns a pointer +to a SCM, as opposed to a pointer to a scm_t_bits. + +This was done to allow the correct use of pointers into the Scheme +heap. Previously, the heap words were of type scm_t_bits and local +variables and function arguments were of type SCM, making it +non-standards-conformant to have a pointer that can point to both. + +** New macros SCM_SMOB_DATA_2, SCM_SMOB_DATA_3, etc. + +These macros should be used instead of SCM_CELL_WORD_2/3 to access the +second and third words of double smobs. Likewise for +SCM_SET_SMOB_DATA_2 and SCM_SET_SMOB_DATA_3. + +Also, there is SCM_SMOB_FLAGS and SCM_SET_SMOB_FLAGS that should be +used to get and set the 16 exra bits in the zeroth word of a smob. + +And finally, there is SCM_SMOB_OBJECT and SCM_SMOB_SET_OBJECT for +accesing the first immediate word of a smob as a SCM value, and there +is SCM_SMOB_OBJECT_LOC for getting a pointer to the first immediate +smob word. Like wise for SCM_SMOB_OBJECT_2, etc. + +** New way to deal with non-local exits and re-entries. + +There is a new set of functions that essentially do what +scm_internal_dynamic_wind does, but in a way that is more convenient +for C code in some situations. Here is a quick example of how to +prevent a potential memory leak: + + void + foo () + { + char *mem; + + scm_dynwind_begin (0); + + mem = scm_malloc (100); + scm_dynwind_unwind_handler (free, mem, SCM_F_WIND_EXPLICITLY); + + /* MEM would leak if BAR throws an error. + SCM_DYNWIND_UNWIND_HANDLER frees it nevertheless. + */ + + bar (); + + scm_dynwind_end (); + + /* Because of SCM_F_WIND_EXPLICITLY, MEM will be freed by + SCM_DYNWIND_END as well. + */ + } + +For full documentation, see the node "Dynamic Wind" in the manual. + +** New function scm_dynwind_free + +This function calls 'free' on a given pointer when a dynwind context +is left. Thus the call to scm_dynwind_unwind_handler above could be +replaced with simply scm_dynwind_free (mem). + +** New functions scm_c_call_with_blocked_asyncs and + scm_c_call_with_unblocked_asyncs + +Like scm_call_with_blocked_asyncs etc. but for C functions. + +** New functions scm_dynwind_block_asyncs and scm_dynwind_unblock_asyncs + +In addition to scm_c_call_with_blocked_asyncs you can now also use +scm_dynwind_block_asyncs in a 'dynwind context' (see above). Likewise for +scm_c_call_with_unblocked_asyncs and scm_dynwind_unblock_asyncs. + +** The macros SCM_DEFER_INTS, SCM_ALLOW_INTS, SCM_REDEFER_INTS, + SCM_REALLOW_INTS have been deprecated. + +They do no longer fulfill their original role of blocking signal +delivery. Depending on what you want to achieve, replace a pair of +SCM_DEFER_INTS and SCM_ALLOW_INTS with a dynwind context that locks a +mutex, blocks asyncs, or both. See node "Critical Sections" in the +manual. + +** The value 'scm_mask_ints' is no longer writable. + +Previously, you could set scm_mask_ints directly. This is no longer +possible. Use scm_c_call_with_blocked_asyncs and +scm_c_call_with_unblocked_asyncs instead. + +** New way to temporarily set the current input, output or error ports + +C code can now use scm_dynwind_current__port in a 'dynwind +context' (see above). is one of "input", "output" or "error". + +** New way to temporarily set fluids + +C code can now use scm_dynwind_fluid in a 'dynwind context' (see +above) to temporarily set the value of a fluid. + +** New types scm_t_intmax and scm_t_uintmax. + +On platforms that have them, these types are identical to intmax_t and +uintmax_t, respectively. On other platforms, they are identical to +the largest integer types that Guile knows about. + +** The functions scm_unmemocopy and scm_unmemoize have been removed. + +You should not have used them. + +** Many public #defines with generic names have been made private. + +#defines with generic names like HAVE_FOO or SIZEOF_FOO have been made +private or renamed with a more suitable public name. + +** The macro SCM_TYP16S has been deprecated. + +This macro is not intended for public use. + +** The macro SCM_SLOPPY_INEXACTP has been deprecated. + +Use scm_is_true (scm_inexact_p (...)) instead. + +** The macro SCM_SLOPPY_REALP has been deprecated. + +Use scm_is_real instead. + +** The macro SCM_SLOPPY_COMPLEXP has been deprecated. + +Use scm_is_complex instead. + +** Some preprocessor defines have been deprecated. + +These defines indicated whether a certain feature was present in Guile +or not. Going forward, assume that the features are always present. + +The macros are: USE_THREADS, GUILE_ISELECT, READER_EXTENSIONS, +DEBUG_EXTENSIONS, DYNAMIC_LINKING. + +The following macros have been removed completely: MEMOIZE_LOCALS, +SCM_RECKLESS, SCM_CAUTIOUS. + +** The preprocessor define STACK_DIRECTION has been deprecated. + +There should be no need to know about the stack direction for ordinary +programs. + +** New function: scm_effective_version + +Returns the "effective" version number. This is just the normal full +version string without the final micro-version number. See "Changes +to the distribution" above. + +** The function scm_call_with_new_thread has a new prototype. + +Instead of taking a list with the thunk and handler, these two +arguments are now passed directly: + + SCM scm_call_with_new_thread (SCM thunk, SCM handler); + +This is an incompatible change. + +** New snarfer macro SCM_DEFINE_PUBLIC. + +This is like SCM_DEFINE, but also calls scm_c_export for the defined +function in the init section. + +** The snarfer macro SCM_SNARF_INIT is now officially supported. + +** Garbage collector rewrite. + +The garbage collector is cleaned up a lot, and now uses lazy +sweeping. This is reflected in the output of (gc-stats); since cells +are being freed when they are allocated, the cells-allocated field +stays roughly constant. + +For malloc related triggers, the behavior is changed. It uses the same +heuristic as the cell-triggered collections. It may be tuned with the +environment variables GUILE_MIN_YIELD_MALLOC. This is the percentage +for minimum yield of malloc related triggers. The default is 40. +GUILE_INIT_MALLOC_LIMIT sets the initial trigger for doing a GC. The +default is 200 kb. + +Debugging operations for the freelist have been deprecated, along with +the C variables that control garbage collection. The environment +variables GUILE_MAX_SEGMENT_SIZE, GUILE_INIT_SEGMENT_SIZE_2, +GUILE_INIT_SEGMENT_SIZE_1, and GUILE_MIN_YIELD_2 should be used. + +For understanding the memory usage of a GUILE program, the routine +gc-live-object-stats returns an alist containing the number of live +objects for every type. + + +** The function scm_definedp has been renamed to scm_defined_p + +The name scm_definedp is deprecated. + +** The struct scm_cell type has been renamed to scm_t_cell + +This is in accordance to Guile's naming scheme for types. Note that +the name scm_cell is now used for a function that allocates and +initializes a new cell (see below). + +** New functions for memory management + +A new set of functions for memory management has been added since the +old way (scm_must_malloc, scm_must_free, etc) was error prone and +indeed, Guile itself contained some long standing bugs that could +cause aborts in long running programs. + +The new functions are more symmetrical and do not need cooperation +from smob free routines, among other improvements. + +The new functions are scm_malloc, scm_realloc, scm_calloc, scm_strdup, +scm_strndup, scm_gc_malloc, scm_gc_calloc, scm_gc_realloc, +scm_gc_free, scm_gc_register_collectable_memory, and +scm_gc_unregister_collectable_memory. Refer to the manual for more +details and for upgrading instructions. + +The old functions for memory management have been deprecated. They +are: scm_must_malloc, scm_must_realloc, scm_must_free, +scm_must_strdup, scm_must_strndup, scm_done_malloc, scm_done_free. + +** Declarations of exported features are marked with SCM_API. + +Every declaration of a feature that belongs to the exported Guile API +has been marked by adding the macro "SCM_API" to the start of the +declaration. This macro can expand into different things, the most +common of which is just "extern" for Unix platforms. On Win32, it can +be used to control which symbols are exported from a DLL. + +If you `#define SCM_IMPORT' before including , SCM_API +will expand into "__declspec (dllimport) extern", which is needed for +linking to the Guile DLL in Windows. + +There are also SCM_RL_IMPORT, SCM_SRFI1314_IMPORT, and +SCM_SRFI4_IMPORT, for the corresponding libraries. + +** SCM_NEWCELL and SCM_NEWCELL2 have been deprecated. + +Use the new functions scm_cell and scm_double_cell instead. The old +macros had problems because with them allocation and initialization +was separated and the GC could sometimes observe half initialized +cells. Only careful coding by the user of SCM_NEWCELL and +SCM_NEWCELL2 could make this safe and efficient. + +** CHECK_ENTRY, CHECK_APPLY and CHECK_EXIT have been deprecated. + +Use the variables scm_check_entry_p, scm_check_apply_p and scm_check_exit_p +instead. + +** SRCBRKP has been deprecated. + +Use scm_c_source_property_breakpoint_p instead. + +** Deprecated: scm_makmacro + +Change your code to use either scm_makmmacro or to define macros in +Scheme, using 'define-macro'. + +** New function scm_c_port_for_each. + +This function is like scm_port_for_each but takes a pointer to a C +function as the callback instead of a SCM value. + +** The names scm_internal_select, scm_thread_sleep, and + scm_thread_usleep have been discouraged. + +Use scm_std_select, scm_std_sleep, scm_std_usleep instead. + +** The GC can no longer be blocked. + +The global flags scm_gc_heap_lock and scm_block_gc have been removed. +The GC can now run (partially) concurrently with other code and thus +blocking it is not well defined. + +** Many definitions have been removed that were previously deprecated. + +scm_lisp_nil, scm_lisp_t, s_nil_ify, scm_m_nil_ify, s_t_ify, +scm_m_t_ify, s_0_cond, scm_m_0_cond, s_0_ify, scm_m_0_ify, s_1_ify, +scm_m_1_ify, scm_debug_newcell, scm_debug_newcell2, +scm_tc16_allocated, SCM_SET_SYMBOL_HASH, SCM_IM_NIL_IFY, SCM_IM_T_IFY, +SCM_IM_0_COND, SCM_IM_0_IFY, SCM_IM_1_IFY, SCM_GC_SET_ALLOCATED, +scm_debug_newcell, scm_debug_newcell2, SCM_HUP_SIGNAL, SCM_INT_SIGNAL, +SCM_FPE_SIGNAL, SCM_BUS_SIGNAL, SCM_SEGV_SIGNAL, SCM_ALRM_SIGNAL, +SCM_GC_SIGNAL, SCM_TICK_SIGNAL, SCM_SIG_ORD, SCM_ORD_SIG, +SCM_NUM_SIGS, scm_top_level_lookup_closure_var, +*top-level-lookup-closure*, scm_system_transformer, scm_eval_3, +scm_eval2, root_module_lookup_closure, SCM_SLOPPY_STRINGP, +SCM_RWSTRINGP, scm_read_only_string_p, scm_make_shared_substring, +scm_tc7_substring, sym_huh, SCM_VARVCELL, SCM_UDVARIABLEP, +SCM_DEFVARIABLEP, scm_mkbig, scm_big2inum, scm_adjbig, scm_normbig, +scm_copybig, scm_2ulong2big, scm_dbl2big, scm_big2dbl, SCM_FIXNUM_BIT, +SCM_SETCHARS, SCM_SLOPPY_SUBSTRP, SCM_SUBSTR_STR, SCM_SUBSTR_OFFSET, +SCM_LENGTH_MAX, SCM_SETLENGTH, SCM_ROSTRINGP, SCM_ROLENGTH, +SCM_ROCHARS, SCM_ROUCHARS, SCM_SUBSTRP, SCM_COERCE_SUBSTR, +scm_sym2vcell, scm_intern, scm_intern0, scm_sysintern, scm_sysintern0, +scm_sysintern0_no_module_lookup, scm_init_symbols_deprecated, +scm_vector_set_length_x, scm_contregs, scm_debug_info, +scm_debug_frame, SCM_DSIDEVAL, SCM_CONST_LONG, SCM_VCELL, +SCM_GLOBAL_VCELL, SCM_VCELL_INIT, SCM_GLOBAL_VCELL_INIT, +SCM_HUGE_LENGTH, SCM_VALIDATE_STRINGORSUBSTR, SCM_VALIDATE_ROSTRING, +SCM_VALIDATE_ROSTRING_COPY, SCM_VALIDATE_NULLORROSTRING_COPY, +SCM_VALIDATE_RWSTRING, DIGITS, scm_small_istr2int, scm_istr2int, +scm_istr2flo, scm_istring2number, scm_istr2int, scm_istr2flo, +scm_istring2number, scm_vtable_index_vcell, scm_si_vcell, SCM_ECONSP, +SCM_NECONSP, SCM_GLOC_VAR, SCM_GLOC_VAL, SCM_GLOC_SET_VAL, +SCM_GLOC_VAL_LOC, scm_make_gloc, scm_gloc_p, scm_tc16_variable, +SCM_CHARS, SCM_LENGTH, SCM_SET_STRING_CHARS, SCM_SET_STRING_LENGTH. + +* Changes to bundled modules + +** (ice-9 debug) + +Using the (ice-9 debug) module no longer automatically switches Guile +to use the debugging evaluator. If you want to switch to the +debugging evaluator (which is needed for backtrace information if you +hit an error), please add an explicit "(debug-enable 'debug)" to your +code just after the code to use (ice-9 debug). + + +Changes since Guile 1.4: + +* Changes to the distribution + +** A top-level TODO file is included. + +** Guile now uses a versioning scheme similar to that of the Linux kernel. + +Guile now always uses three numbers to represent the version, +i.e. "1.6.5". The first number, 1, is the major version number, the +second number, 6, is the minor version number, and the third number, +5, is the micro version number. Changes in major version number +indicate major changes in Guile. + +Minor version numbers that are even denote stable releases, and odd +minor version numbers denote development versions (which may be +unstable). The micro version number indicates a minor sub-revision of +a given MAJOR.MINOR release. + +In keeping with the new scheme, (minor-version) and scm_minor_version +no longer return everything but the major version number. They now +just return the minor version number. Two new functions +(micro-version) and scm_micro_version have been added to report the +micro version number. + +In addition, ./GUILE-VERSION now defines GUILE_MICRO_VERSION. + +** New preprocessor definitions are available for checking versions. + +version.h now #defines SCM_MAJOR_VERSION, SCM_MINOR_VERSION, and +SCM_MICRO_VERSION to the appropriate integer values. + +** Guile now actively warns about deprecated features. + +The new configure option `--enable-deprecated=LEVEL' and the +environment variable GUILE_WARN_DEPRECATED control this mechanism. +See INSTALL and README for more information. + +** Guile is much more likely to work on 64-bit architectures. + +Guile now compiles and passes "make check" with only two UNRESOLVED GC +cases on Alpha and ia64 based machines now. Thanks to John Goerzen +for the use of a test machine, and thanks to Stefan Jahn for ia64 +patches. + +** New functions: setitimer and getitimer. + +These implement a fairly direct interface to the libc functions of the +same name. + +** The #. reader extension is now disabled by default. + +For safety reasons, #. evaluation is disabled by default. To +re-enable it, set the fluid read-eval? to #t. For example: + + (fluid-set! read-eval? #t) + +but make sure you realize the potential security risks involved. With +read-eval? enabled, reading a data file from an untrusted source can +be dangerous. + +** New SRFI modules have been added: + +SRFI-0 `cond-expand' is now supported in Guile, without requiring +using a module. + +(srfi srfi-1) is a library containing many useful pair- and list-processing + procedures. + +(srfi srfi-2) exports and-let*. + +(srfi srfi-4) implements homogeneous numeric vector datatypes. + +(srfi srfi-6) is a dummy module for now, since guile already provides + all of the srfi-6 procedures by default: open-input-string, + open-output-string, get-output-string. + +(srfi srfi-8) exports receive. + +(srfi srfi-9) exports define-record-type. + +(srfi srfi-10) exports define-reader-ctor and implements the reader + extension #,(). + +(srfi srfi-11) exports let-values and let*-values. + +(srfi srfi-13) implements the SRFI String Library. + +(srfi srfi-14) implements the SRFI Character-Set Library. + +(srfi srfi-17) implements setter and getter-with-setter and redefines + some accessor procedures as procedures with getters. (such as car, + cdr, vector-ref etc.) + +(srfi srfi-19) implements the SRFI Time/Date Library. + +** New scripts / "executable modules" + +Subdirectory "scripts" contains Scheme modules that are packaged to +also be executable as scripts. At this time, these scripts are available: + + display-commentary + doc-snarf + generate-autoload + punify + read-scheme-source + use2dot + +See README there for more info. + +These scripts can be invoked from the shell with the new program +"guile-tools", which keeps track of installation directory for you. +For example: + + $ guile-tools display-commentary srfi/*.scm + +guile-tools is copied to the standard $bindir on "make install". + +** New module (ice-9 stack-catch): + +stack-catch is like catch, but saves the current state of the stack in +the fluid the-last-stack. This fluid can be useful when using the +debugger and when re-throwing an error. + +** The module (ice-9 and-let*) has been renamed to (ice-9 and-let-star) + +This has been done to prevent problems on lesser operating systems +that can't tolerate `*'s in file names. The exported macro continues +to be named `and-let*', of course. + +On systems that support it, there is also a compatibility module named +(ice-9 and-let*). It will go away in the next release. + +** New modules (oop goops) etc.: + + (oop goops) + (oop goops describe) + (oop goops save) + (oop goops active-slot) + (oop goops composite-slot) + +The Guile Object Oriented Programming System (GOOPS) has been +integrated into Guile. For further information, consult the GOOPS +manual and tutorial in the `doc' directory. + +** New module (ice-9 rdelim). + +This exports the following procedures which were previously defined +in the default environment: + +read-line read-line! read-delimited read-delimited! %read-delimited! +%read-line write-line + +For backwards compatibility the definitions are still imported into the +default environment in this version of Guile. However you should add: + +(use-modules (ice-9 rdelim)) + +to any program which uses the definitions, since this may change in +future. + +Alternatively, if guile-scsh is installed, the (scsh rdelim) module +can be used for similar functionality. + +** New module (ice-9 rw) + +This is a subset of the (scsh rw) module from guile-scsh. Currently +it defines two procedures: + +*** New function: read-string!/partial str [port_or_fdes [start [end]]] + + Read characters from a port or file descriptor into a string STR. + A port must have an underlying file descriptor -- a so-called + fport. This procedure is scsh-compatible and can efficiently read + large strings. + +*** New function: write-string/partial str [port_or_fdes [start [end]]] + + Write characters from a string STR to a port or file descriptor. + A port must have an underlying file descriptor -- a so-called + fport. This procedure is mostly compatible and can efficiently + write large strings. + +** New module (ice-9 match) + +This module includes Andrew K. Wright's pattern matcher. See +ice-9/match.scm for brief description or + + http://www.star-lab.com/wright/code.html + +for complete documentation. + +** New module (ice-9 buffered-input) + +This module provides procedures to construct an input port from an +underlying source of input that reads and returns its input in chunks. +The underlying input source is a Scheme procedure, specified by the +caller, which the port invokes whenever it needs more input. + +This is useful when building an input port whose back end is Readline +or a UI element such as the GtkEntry widget. + +** Documentation + +The reference and tutorial documentation that was previously +distributed separately, as `guile-doc', is now included in the core +Guile distribution. The documentation consists of the following +manuals. + +- The Guile Tutorial (guile-tut.texi) contains a tutorial introduction + to using Guile. + +- The Guile Reference Manual (guile.texi) contains (or is intended to + contain) reference documentation on all aspects of Guile. + +- The GOOPS Manual (goops.texi) contains both tutorial-style and + reference documentation for using GOOPS, Guile's Object Oriented + Programming System. + +- The Revised^5 Report on the Algorithmic Language Scheme + (r5rs.texi). + +See the README file in the `doc' directory for more details. + +** There are a couple of examples in the examples/ directory now. + +* Changes to the stand-alone interpreter + +** New command line option `--use-srfi' + +Using this option, SRFI modules can be loaded on startup and be +available right from the beginning. This makes programming portable +Scheme programs easier. + +The option `--use-srfi' expects a comma-separated list of numbers, +each representing a SRFI number to be loaded into the interpreter +before starting evaluating a script file or the REPL. Additionally, +the feature identifier for the loaded SRFIs is recognized by +`cond-expand' when using this option. + +Example: +$ guile --use-srfi=8,13 +guile> (receive (x z) (values 1 2) (+ 1 2)) +3 +guile> (string-pad "bla" 20) +" bla" + +** Guile now always starts up in the `(guile-user)' module. + +Previously, scripts executed via the `-s' option would run in the +`(guile)' module and the repl would run in the `(guile-user)' module. +Now every user action takes place in the `(guile-user)' module by +default. + +* Changes to Scheme functions and syntax + +** Character classifiers work for non-ASCII characters. + +The predicates `char-alphabetic?', `char-numeric?', +`char-whitespace?', `char-lower?', `char-upper?' and `char-is-both?' +no longer check whether their arguments are ASCII characters. +Previously, a character would only be considered alphabetic when it +was also ASCII, for example. + +** Previously deprecated Scheme functions have been removed: + + tag - no replacement. + fseek - replaced by seek. + list* - replaced by cons*. + +** It's now possible to create modules with controlled environments + +Example: + +(use-modules (ice-9 safe)) +(define m (make-safe-module)) +;;; m will now be a module containing only a safe subset of R5RS +(eval '(+ 1 2) m) --> 3 +(eval 'load m) --> ERROR: Unbound variable: load + +** Evaluation of "()", the empty list, is now an error. + +Previously, the expression "()" evaluated to the empty list. This has +been changed to signal a "missing expression" error. The correct way +to write the empty list as a literal constant is to use quote: "'()". + +** New concept of `Guile Extensions'. + +A Guile Extension is just a ordinary shared library that can be linked +at run-time. We found it advantageous to give this simple concept a +dedicated name to distinguish the issues related to shared libraries +from the issues related to the module system. + +*** New function: load-extension + +Executing (load-extension lib init) is mostly equivalent to + + (dynamic-call init (dynamic-link lib)) + +except when scm_register_extension has been called previously. +Whenever appropriate, you should use `load-extension' instead of +dynamic-link and dynamic-call. + +*** New C function: scm_c_register_extension + +This function registers a initialization function for use by +`load-extension'. Use it when you don't want specific extensions to +be loaded as shared libraries (for example on platforms that don't +support dynamic linking). + +** Auto-loading of compiled-code modules is deprecated. + +Guile used to be able to automatically find and link a shared +library to satisfy requests for a module. For example, the module +`(foo bar)' could be implemented by placing a shared library named +"foo/libbar.so" (or with a different extension) in a directory on the +load path of Guile. + +This has been found to be too tricky, and is no longer supported. The +shared libraries are now called "extensions". You should now write a +small Scheme file that calls `load-extension' to load the shared +library and initialize it explicitly. + +The shared libraries themselves should be installed in the usual +places for shared libraries, with names like "libguile-foo-bar". + +For example, place this into a file "foo/bar.scm" + + (define-module (foo bar)) + + (load-extension "libguile-foo-bar" "foobar_init") + +** Backward incompatible change: eval EXP ENVIRONMENT-SPECIFIER + +`eval' is now R5RS, that is it takes two arguments. +The second argument is an environment specifier, i.e. either + + (scheme-report-environment 5) + (null-environment 5) + (interaction-environment) + +or + + any module. + +** The module system has been made more disciplined. + +The function `eval' will save and restore the current module around +the evaluation of the specified expression. While this expression is +evaluated, `(current-module)' will now return the right module, which +is the module specified as the second argument to `eval'. + +A consequence of this change is that `eval' is not particularly +useful when you want allow the evaluated code to change what module is +designated as the current module and have this change persist from one +call to `eval' to the next. The read-eval-print-loop is an example +where `eval' is now inadequate. To compensate, there is a new +function `primitive-eval' that does not take a module specifier and +that does not save/restore the current module. You should use this +function together with `set-current-module', `current-module', etc +when you want to have more control over the state that is carried from +one eval to the next. + +Additionally, it has been made sure that forms that are evaluated at +the top level are always evaluated with respect to the current module. +Previously, subforms of top-level forms such as `begin', `case', +etc. did not respect changes to the current module although these +subforms are at the top-level as well. + +To prevent strange behavior, the forms `define-module', +`use-modules', `use-syntax', and `export' have been restricted to only +work on the top level. The forms `define-public' and +`defmacro-public' only export the new binding on the top level. They +behave just like `define' and `defmacro', respectively, when they are +used in a lexical environment. + +Also, `export' will no longer silently re-export bindings imported +from a used module. It will emit a `deprecation' warning and will +cease to perform any re-export in the next version. If you actually +want to re-export bindings, use the new `re-export' in place of +`export'. The new `re-export' will not make copies of variables when +rexporting them, as `export' did wrongly. + +** Module system now allows selection and renaming of imported bindings + +Previously, when using `use-modules' or the `#:use-module' clause in +the `define-module' form, all the bindings (association of symbols to +values) for imported modules were added to the "current module" on an +as-is basis. This has been changed to allow finer control through two +new facilities: selection and renaming. + +You can now select which of the imported module's bindings are to be +visible in the current module by using the `:select' clause. This +clause also can be used to rename individual bindings. For example: + + ;; import all bindings no questions asked + (use-modules (ice-9 common-list)) + + ;; import four bindings, renaming two of them; + ;; the current module sees: every some zonk-y zonk-n + (use-modules ((ice-9 common-list) + :select (every some + (remove-if . zonk-y) + (remove-if-not . zonk-n)))) + +You can also programmatically rename all selected bindings using the +`:renamer' clause, which specifies a proc that takes a symbol and +returns another symbol. Because it is common practice to use a prefix, +we now provide the convenience procedure `symbol-prefix-proc'. For +example: + + ;; import four bindings, renaming two of them specifically, + ;; and all four w/ prefix "CL:"; + ;; the current module sees: CL:every CL:some CL:zonk-y CL:zonk-n + (use-modules ((ice-9 common-list) + :select (every some + (remove-if . zonk-y) + (remove-if-not . zonk-n)) + :renamer (symbol-prefix-proc 'CL:))) + + ;; import four bindings, renaming two of them specifically, + ;; and all four by upcasing. + ;; the current module sees: EVERY SOME ZONK-Y ZONK-N + (define (upcase-symbol sym) + (string->symbol (string-upcase (symbol->string sym)))) + + (use-modules ((ice-9 common-list) + :select (every some + (remove-if . zonk-y) + (remove-if-not . zonk-n)) + :renamer upcase-symbol)) + +Note that programmatic renaming is done *after* individual renaming. +Also, the above examples show `use-modules', but the same facilities are +available for the `#:use-module' clause of `define-module'. + +See manual for more info. + +** The semantics of guardians have changed. + +The changes are for the most part compatible. An important criterion +was to keep the typical usage of guardians as simple as before, but to +make the semantics safer and (as a result) more useful. + +*** All objects returned from guardians are now properly alive. + +It is now guaranteed that any object referenced by an object returned +from a guardian is alive. It's now impossible for a guardian to +return a "contained" object before its "containing" object. + +One incompatible (but probably not very important) change resulting +from this is that it is no longer possible to guard objects that +indirectly reference themselves (i.e. are parts of cycles). If you do +so accidentally, you'll get a warning. + +*** There are now two types of guardians: greedy and sharing. + +If you call (make-guardian #t) or just (make-guardian), you'll get a +greedy guardian, and for (make-guardian #f) a sharing guardian. + +Greedy guardians are the default because they are more "defensive". +You can only greedily guard an object once. If you guard an object +more than once, once in a greedy guardian and the rest of times in +sharing guardians, then it is guaranteed that the object won't be +returned from sharing guardians as long as it is greedily guarded +and/or alive. + +Guardians returned by calls to `make-guardian' can now take one more +optional parameter, which says whether to throw an error in case an +attempt is made to greedily guard an object that is already greedily +guarded. The default is true, i.e. throw an error. If the parameter +is false, the guardian invocation returns #t if guarding was +successful and #f if it wasn't. + +Also, since greedy guarding is, in effect, a side-effecting operation +on objects, a new function is introduced: `destroy-guardian!'. +Invoking this function on a guardian renders it unoperative and, if +the guardian is greedy, clears the "greedily guarded" property of the +objects that were guarded by it, thus undoing the side effect. + +Note that all this hair is hardly very important, since guardian +objects are usually permanent. + +** Continuations created by call-with-current-continuation now accept +any number of arguments, as required by R5RS. + +** New function `issue-deprecation-warning' + +This function is used to display the deprecation messages that are +controlled by GUILE_WARN_DEPRECATION as explained in the README. + + (define (id x) + (issue-deprecation-warning "`id' is deprecated. Use `identity' instead.") + (identity x)) + + guile> (id 1) + ;; `id' is deprecated. Use `identity' instead. + 1 + guile> (id 1) + 1 + +** New syntax `begin-deprecated' + +When deprecated features are included (as determined by the configure +option --enable-deprecated), `begin-deprecated' is identical to +`begin'. When deprecated features are excluded, it always evaluates +to `#f', ignoring the body forms. + +** New function `make-object-property' + +This function returns a new `procedure with setter' P that can be used +to attach a property to objects. When calling P as + + (set! (P obj) val) + +where `obj' is any kind of object, it attaches `val' to `obj' in such +a way that it can be retrieved by calling P as + + (P obj) + +This function will replace procedure properties, symbol properties and +source properties eventually. + +** Module (ice-9 optargs) now uses keywords instead of `#&'. + +Instead of #&optional, #&key, etc you should now use #:optional, +#:key, etc. Since #:optional is a keyword, you can write it as just +:optional when (read-set! keywords 'prefix) is active. + +The old reader syntax `#&' is still supported, but deprecated. It +will be removed in the next release. + +** New define-module option: pure + +Tells the module system not to include any bindings from the root +module. + +Example: + +(define-module (totally-empty-module) + :pure) + +** New define-module option: export NAME1 ... + +Export names NAME1 ... + +This option is required if you want to be able to export bindings from +a module which doesn't import one of `define-public' or `export'. + +Example: + + (define-module (foo) + :pure + :use-module (ice-9 r5rs) + :export (bar)) + + ;;; Note that we're pure R5RS below this point! + + (define (bar) + ...) + +** New function: object->string OBJ + +Return a Scheme string obtained by printing a given object. + +** New function: port? X + +Returns a boolean indicating whether X is a port. Equivalent to +`(or (input-port? X) (output-port? X))'. + +** New function: file-port? + +Determines whether a given object is a port that is related to a file. + +** New function: port-for-each proc + +Apply PROC to each port in the Guile port table in turn. The return +value is unspecified. More specifically, PROC is applied exactly once +to every port that exists in the system at the time PORT-FOR-EACH is +invoked. Changes to the port table while PORT-FOR-EACH is running +have no effect as far as PORT-FOR-EACH is concerned. + +** New function: dup2 oldfd newfd + +A simple wrapper for the `dup2' system call. Copies the file +descriptor OLDFD to descriptor number NEWFD, replacing the +previous meaning of NEWFD. Both OLDFD and NEWFD must be integers. +Unlike for dup->fdes or primitive-move->fdes, no attempt is made +to move away ports which are using NEWFD. The return value is +unspecified. + +** New function: close-fdes fd + +A simple wrapper for the `close' system call. Close file +descriptor FD, which must be an integer. Unlike close (*note +close: Ports and File Descriptors.), the file descriptor will be +closed even if a port is using it. The return value is +unspecified. + +** New function: crypt password salt + +Encrypts `password' using the standard unix password encryption +algorithm. + +** New function: chroot path + +Change the root directory of the running process to `path'. + +** New functions: getlogin, cuserid + +Return the login name or the user name of the current effective user +id, respectively. + +** New functions: getpriority which who, setpriority which who prio + +Get or set the priority of the running process. + +** New function: getpass prompt + +Read a password from the terminal, first displaying `prompt' and +disabling echoing. + +** New function: flock file operation + +Set/remove an advisory shared or exclusive lock on `file'. + +** New functions: sethostname name, gethostname + +Set or get the hostname of the machine the current process is running +on. + +** New function: mkstemp! tmpl + +mkstemp creates a new unique file in the file system and returns a +new buffered port open for reading and writing to the file. TMPL +is a string specifying where the file should be created: it must +end with `XXXXXX' and will be changed in place to return the name +of the temporary file. + +** New function: open-input-string string + +Return an input string port which delivers the characters from +`string'. This procedure, together with `open-output-string' and +`get-output-string' implements SRFI-6. + +** New function: open-output-string + +Return an output string port which collects all data written to it. +The data can then be retrieved by `get-output-string'. + +** New function: get-output-string + +Return the contents of an output string port. + +** New function: identity + +Return the argument. + +** socket, connect, accept etc., now have support for IPv6. IPv6 addresses + are represented in Scheme as integers with normal host byte ordering. + +** New function: inet-pton family address + +Convert a printable string network address into an integer. Note that +unlike the C version of this function, the result is an integer with +normal host byte ordering. FAMILY can be `AF_INET' or `AF_INET6'. +e.g., + + (inet-pton AF_INET "127.0.0.1") => 2130706433 + (inet-pton AF_INET6 "::1") => 1 + +** New function: inet-ntop family address + +Convert an integer network address into a printable string. Note that +unlike the C version of this function, the input is an integer with +normal host byte ordering. FAMILY can be `AF_INET' or `AF_INET6'. +e.g., + + (inet-ntop AF_INET 2130706433) => "127.0.0.1" + (inet-ntop AF_INET6 (- (expt 2 128) 1)) => + ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff + +** Deprecated: id + +Use `identity' instead. + +** Deprecated: -1+ + +Use `1-' instead. + +** Deprecated: return-it + +Do without it. + +** Deprecated: string-character-length + +Use `string-length' instead. + +** Deprecated: flags + +Use `logior' instead. + +** Deprecated: close-all-ports-except. + +This was intended for closing ports in a child process after a fork, +but it has the undesirable side effect of flushing buffers. +port-for-each is more flexible. + +** The (ice-9 popen) module now attempts to set up file descriptors in +the child process from the current Scheme ports, instead of using the +current values of file descriptors 0, 1, and 2 in the parent process. + +** Removed function: builtin-weak-bindings + +There is no such concept as a weak binding any more. + +** Removed constants: bignum-radix, scm-line-incrementors + +** define-method: New syntax mandatory. + +The new method syntax is now mandatory: + +(define-method (NAME ARG-SPEC ...) BODY ...) +(define-method (NAME ARG-SPEC ... . REST-ARG) BODY ...) + + ARG-SPEC ::= ARG-NAME | (ARG-NAME TYPE) + REST-ARG ::= ARG-NAME + +If you have old code using the old syntax, import +(oop goops old-define-method) before (oop goops) as in: + + (use-modules (oop goops old-define-method) (oop goops)) + +** Deprecated function: builtin-variable + Removed function: builtin-bindings + +There is no longer a distinction between builtin or other variables. +Use module system operations for all variables. + +** Lazy-catch handlers are no longer allowed to return. + +That is, a call to `throw', `error', etc is now guaranteed to not +return. + +** Bugfixes for (ice-9 getopt-long) + +This module is now tested using test-suite/tests/getopt-long.test. +The following bugs have been fixed: + +*** Parsing for options that are specified to have `optional' args now checks +if the next element is an option instead of unconditionally taking it as the +option arg. + +*** An error is now thrown for `--opt=val' when the option description +does not specify `(value #t)' or `(value optional)'. This condition used to +be accepted w/o error, contrary to the documentation. + +*** The error message for unrecognized options is now more informative. +It used to be "not a record", an artifact of the implementation. + +*** The error message for `--opt' terminating the arg list (no value), when +`(value #t)' is specified, is now more informative. It used to be "not enough +args". + +*** "Clumped" single-char args now preserve trailing string, use it as arg. +The expansion used to be like so: + + ("-abc5d" "--xyz") => ("-a" "-b" "-c" "--xyz") + +Note that the "5d" is dropped. Now it is like so: + + ("-abc5d" "--xyz") => ("-a" "-b" "-c" "5d" "--xyz") + +This enables single-char options to have adjoining arguments as long as their +constituent characters are not potential single-char options. + +** (ice-9 session) procedure `arity' now works with (ice-9 optargs) `lambda*' + +The `lambda*' and derivative forms in (ice-9 optargs) now set a procedure +property `arglist', which can be retrieved by `arity'. The result is that +`arity' can give more detailed information than before: + +Before: + + guile> (use-modules (ice-9 optargs)) + guile> (define* (foo #:optional a b c) a) + guile> (arity foo) + 0 or more arguments in `lambda*:G0'. + +After: + + guile> (arity foo) + 3 optional arguments: `a', `b' and `c'. + guile> (define* (bar a b #:key c d #:allow-other-keys) a) + guile> (arity bar) + 2 required arguments: `a' and `b', 2 keyword arguments: `c' + and `d', other keywords allowed. + guile> (define* (baz a b #:optional c #:rest r) a) + guile> (arity baz) + 2 required arguments: `a' and `b', 1 optional argument: `c', + the rest in `r'. + +* Changes to the C interface + +** Types have been renamed from scm_*_t to scm_t_*. + +This has been done for POSIX sake. It reserves identifiers ending +with "_t". What a concept. + +The old names are still available with status `deprecated'. + +** scm_t_bits (former scm_bits_t) is now a unsigned type. + +** Deprecated features have been removed. + +*** Macros removed + + SCM_INPORTP, SCM_OUTPORTP SCM_ICHRP, SCM_ICHR, SCM_MAKICHR + SCM_SETJMPBUF SCM_NSTRINGP SCM_NRWSTRINGP SCM_NVECTORP SCM_DOUBLE_CELLP + +*** C Functions removed + + scm_sysmissing scm_tag scm_tc16_flo scm_tc_flo + scm_fseek - replaced by scm_seek. + gc-thunk - replaced by after-gc-hook. + gh_int2scmb - replaced by gh_bool2scm. + scm_tc_dblr - replaced by scm_tc16_real. + scm_tc_dblc - replaced by scm_tc16_complex. + scm_list_star - replaced by scm_cons_star. + +** Deprecated: scm_makfromstr + +Use scm_mem2string instead. + +** Deprecated: scm_make_shared_substring + +Explicit shared substrings will disappear from Guile. + +Instead, "normal" strings will be implemented using sharing +internally, combined with a copy-on-write strategy. + +** Deprecated: scm_read_only_string_p + +The concept of read-only strings will disappear in next release of +Guile. + +** Deprecated: scm_sloppy_memq, scm_sloppy_memv, scm_sloppy_member + +Instead, use scm_c_memq or scm_memq, scm_memv, scm_member. + +** New functions: scm_call_0, scm_call_1, scm_call_2, scm_call_3 + +Call a procedure with the indicated number of arguments. See "Fly +Evaluation" in the manual. + +** New functions: scm_apply_0, scm_apply_1, scm_apply_2, scm_apply_3 + +Call a procedure with the indicated number of arguments and a list of +further arguments. See "Fly Evaluation" in the manual. + +** New functions: scm_list_1, scm_list_2, scm_list_3, scm_list_4, scm_list_5 + +Create a list of the given number of elements. See "List +Constructors" in the manual. + +** Renamed function: scm_listify has been replaced by scm_list_n. + +** Deprecated macros: SCM_LIST0, SCM_LIST1, SCM_LIST2, SCM_LIST3, SCM_LIST4, +SCM_LIST5, SCM_LIST6, SCM_LIST7, SCM_LIST8, SCM_LIST9. + +Use functions scm_list_N instead. + +** New function: scm_c_read (SCM port, void *buffer, scm_sizet size) + +Used by an application to read arbitrary number of bytes from a port. +Same semantics as libc read, except that scm_c_read only returns less +than SIZE bytes if at end-of-file. + +Warning: Doesn't update port line and column counts! + +** New function: scm_c_write (SCM port, const void *ptr, scm_sizet size) + +Used by an application to write arbitrary number of bytes to an SCM +port. Similar semantics as libc write. However, unlike libc +write, scm_c_write writes the requested number of bytes and has no +return value. + +Warning: Doesn't update port line and column counts! + +** New function: scm_init_guile () + +In contrast to scm_boot_guile, scm_init_guile will return normally +after initializing Guile. It is not available on all systems, tho. + +** New functions: scm_str2symbol, scm_mem2symbol + +The function scm_str2symbol takes a const char* pointing to a zero-terminated +field of characters and creates a scheme symbol object from that C string. +The function scm_mem2symbol takes a const char* and a number of characters and +creates a symbol from the characters in that memory area. + +** New functions: scm_primitive_make_property + scm_primitive_property_ref + scm_primitive_property_set_x + scm_primitive_property_del_x + +These functions implement a new way to deal with object properties. +See libguile/properties.c for their documentation. + +** New function: scm_done_free (long size) + +This function is the inverse of scm_done_malloc. Use it to report the +amount of smob memory you free. The previous method, which involved +calling scm_done_malloc with negative argument, was somewhat +unintuitive (and is still available, of course). + +** New function: scm_c_memq (SCM obj, SCM list) + +This function provides a fast C level alternative for scm_memq for the case +that the list parameter is known to be a proper list. The function is a +replacement for scm_sloppy_memq, but is stricter in its requirements on its +list input parameter, since for anything else but a proper list the function's +behaviour is undefined - it may even crash or loop endlessly. Further, for +the case that the object is not found in the list, scm_c_memq returns #f which +is similar to scm_memq, but different from scm_sloppy_memq's behaviour. + +** New functions: scm_remember_upto_here_1, scm_remember_upto_here_2, +scm_remember_upto_here + +These functions replace the function scm_remember. + +** Deprecated function: scm_remember + +Use one of the new functions scm_remember_upto_here_1, +scm_remember_upto_here_2 or scm_remember_upto_here instead. + +** New function: scm_allocate_string + +This function replaces the function scm_makstr. + +** Deprecated function: scm_makstr + +Use the new function scm_allocate_string instead. + +** New global variable scm_gc_running_p introduced. + +Use this variable to find out if garbage collection is being executed. Up to +now applications have used scm_gc_heap_lock to test if garbage collection was +running, which also works because of the fact that up to know only the garbage +collector has set this variable. But, this is an implementation detail that +may change. Further, scm_gc_heap_lock is not set throughout gc, thus the use +of this variable is (and has been) not fully safe anyway. + +** New macros: SCM_BITVECTOR_MAX_LENGTH, SCM_UVECTOR_MAX_LENGTH + +Use these instead of SCM_LENGTH_MAX. + +** New macros: SCM_CONTINUATION_LENGTH, SCM_CCLO_LENGTH, SCM_STACK_LENGTH, +SCM_STRING_LENGTH, SCM_SYMBOL_LENGTH, SCM_UVECTOR_LENGTH, +SCM_BITVECTOR_LENGTH, SCM_VECTOR_LENGTH. + +Use these instead of SCM_LENGTH. + +** New macros: SCM_SET_CONTINUATION_LENGTH, SCM_SET_STRING_LENGTH, +SCM_SET_SYMBOL_LENGTH, SCM_SET_VECTOR_LENGTH, SCM_SET_UVECTOR_LENGTH, +SCM_SET_BITVECTOR_LENGTH + +Use these instead of SCM_SETLENGTH + +** New macros: SCM_STRING_CHARS, SCM_SYMBOL_CHARS, SCM_CCLO_BASE, +SCM_VECTOR_BASE, SCM_UVECTOR_BASE, SCM_BITVECTOR_BASE, SCM_COMPLEX_MEM, +SCM_ARRAY_MEM + +Use these instead of SCM_CHARS, SCM_UCHARS, SCM_ROCHARS, SCM_ROUCHARS or +SCM_VELTS. + +** New macros: SCM_SET_BIGNUM_BASE, SCM_SET_STRING_CHARS, +SCM_SET_SYMBOL_CHARS, SCM_SET_UVECTOR_BASE, SCM_SET_BITVECTOR_BASE, +SCM_SET_VECTOR_BASE + +Use these instead of SCM_SETCHARS. + +** New macro: SCM_BITVECTOR_P + +** New macro: SCM_STRING_COERCE_0TERMINATION_X + +Use instead of SCM_COERCE_SUBSTR. + +** New macros: SCM_DIR_OPEN_P, SCM_DIR_FLAG_OPEN + +For directory objects, use these instead of SCM_OPDIRP and SCM_OPN. + +** Deprecated macros: SCM_OUTOFRANGE, SCM_NALLOC, SCM_HUP_SIGNAL, +SCM_INT_SIGNAL, SCM_FPE_SIGNAL, SCM_BUS_SIGNAL, SCM_SEGV_SIGNAL, +SCM_ALRM_SIGNAL, SCM_GC_SIGNAL, SCM_TICK_SIGNAL, SCM_SIG_ORD, +SCM_ORD_SIG, SCM_NUM_SIGS, SCM_SYMBOL_SLOTS, SCM_SLOTS, SCM_SLOPPY_STRINGP, +SCM_VALIDATE_STRINGORSUBSTR, SCM_FREEP, SCM_NFREEP, SCM_CHARS, SCM_UCHARS, +SCM_VALIDATE_ROSTRING, SCM_VALIDATE_ROSTRING_COPY, +SCM_VALIDATE_NULLORROSTRING_COPY, SCM_ROLENGTH, SCM_LENGTH, SCM_HUGE_LENGTH, +SCM_SUBSTRP, SCM_SUBSTR_STR, SCM_SUBSTR_OFFSET, SCM_COERCE_SUBSTR, +SCM_ROSTRINGP, SCM_RWSTRINGP, SCM_VALIDATE_RWSTRING, SCM_ROCHARS, +SCM_ROUCHARS, SCM_SETLENGTH, SCM_SETCHARS, SCM_LENGTH_MAX, SCM_GC8MARKP, +SCM_SETGC8MARK, SCM_CLRGC8MARK, SCM_GCTYP16, SCM_GCCDR, SCM_SUBR_DOC, +SCM_OPDIRP, SCM_VALIDATE_OPDIR, SCM_WTA, RETURN_SCM_WTA, SCM_CONST_LONG, +SCM_WNA, SCM_FUNC_NAME, SCM_VALIDATE_NUMBER_COPY, +SCM_VALIDATE_NUMBER_DEF_COPY, SCM_SLOPPY_CONSP, SCM_SLOPPY_NCONSP, +SCM_SETAND_CDR, SCM_SETOR_CDR, SCM_SETAND_CAR, SCM_SETOR_CAR + +Use SCM_ASSERT_RANGE or SCM_VALIDATE_XXX_RANGE instead of SCM_OUTOFRANGE. +Use scm_memory_error instead of SCM_NALLOC. +Use SCM_STRINGP instead of SCM_SLOPPY_STRINGP. +Use SCM_VALIDATE_STRING instead of SCM_VALIDATE_STRINGORSUBSTR. +Use SCM_FREE_CELL_P instead of SCM_FREEP/SCM_NFREEP +Use a type specific accessor macro instead of SCM_CHARS/SCM_UCHARS. +Use a type specific accessor instead of SCM(_|_RO|_HUGE_)LENGTH. +Use SCM_VALIDATE_(SYMBOL|STRING) instead of SCM_VALIDATE_ROSTRING. +Use SCM_STRING_COERCE_0TERMINATION_X instead of SCM_COERCE_SUBSTR. +Use SCM_STRINGP or SCM_SYMBOLP instead of SCM_ROSTRINGP. +Use SCM_STRINGP instead of SCM_RWSTRINGP. +Use SCM_VALIDATE_STRING instead of SCM_VALIDATE_RWSTRING. +Use SCM_STRING_CHARS instead of SCM_ROCHARS. +Use SCM_STRING_UCHARS instead of SCM_ROUCHARS. +Use a type specific setter macro instead of SCM_SETLENGTH. +Use a type specific setter macro instead of SCM_SETCHARS. +Use a type specific length macro instead of SCM_LENGTH_MAX. +Use SCM_GCMARKP instead of SCM_GC8MARKP. +Use SCM_SETGCMARK instead of SCM_SETGC8MARK. +Use SCM_CLRGCMARK instead of SCM_CLRGC8MARK. +Use SCM_TYP16 instead of SCM_GCTYP16. +Use SCM_CDR instead of SCM_GCCDR. +Use SCM_DIR_OPEN_P instead of SCM_OPDIRP. +Use SCM_MISC_ERROR or SCM_WRONG_TYPE_ARG instead of SCM_WTA. +Use SCM_MISC_ERROR or SCM_WRONG_TYPE_ARG instead of RETURN_SCM_WTA. +Use SCM_VCELL_INIT instead of SCM_CONST_LONG. +Use SCM_WRONG_NUM_ARGS instead of SCM_WNA. +Use SCM_CONSP instead of SCM_SLOPPY_CONSP. +Use !SCM_CONSP instead of SCM_SLOPPY_NCONSP. + +** Removed function: scm_struct_init + +** Removed variable: scm_symhash_dim + +** Renamed function: scm_make_cont has been replaced by +scm_make_continuation, which has a different interface. + +** Deprecated function: scm_call_catching_errors + +Use scm_catch or scm_lazy_catch from throw.[ch] instead. + +** Deprecated function: scm_strhash + +Use scm_string_hash instead. + +** Deprecated function: scm_vector_set_length_x + +Instead, create a fresh vector of the desired size and copy the contents. + +** scm_gensym has changed prototype + +scm_gensym now only takes one argument. + +** Deprecated type tags: scm_tc7_ssymbol, scm_tc7_msymbol, scm_tcs_symbols, +scm_tc7_lvector + +There is now only a single symbol type scm_tc7_symbol. +The tag scm_tc7_lvector was not used anyway. + +** Deprecated function: scm_make_smob_type_mfpe, scm_set_smob_mfpe. + +Use scm_make_smob_type and scm_set_smob_XXX instead. + +** New function scm_set_smob_apply. + +This can be used to set an apply function to a smob type. + +** Deprecated function: scm_strprint_obj + +Use scm_object_to_string instead. + +** Deprecated function: scm_wta + +Use scm_wrong_type_arg, or another appropriate error signalling function +instead. + +** Explicit support for obarrays has been deprecated. + +Use `scm_str2symbol' and the generic hashtable functions instead. + +** The concept of `vcells' has been deprecated. + +The data type `variable' is now used exclusively. `Vcells' have been +a low-level concept so you are likely not affected by this change. + +*** Deprecated functions: scm_sym2vcell, scm_sysintern, + scm_sysintern0, scm_symbol_value0, scm_intern, scm_intern0. + +Use scm_c_define or scm_c_lookup instead, as appropriate. + +*** New functions: scm_c_module_lookup, scm_c_lookup, + scm_c_module_define, scm_c_define, scm_module_lookup, scm_lookup, + scm_module_define, scm_define. + +These functions work with variables instead of with vcells. + +** New functions for creating and defining `subr's and `gsubr's. + +The new functions more clearly distinguish between creating a subr (or +gsubr) object and adding it to the current module. + +These new functions are available: scm_c_make_subr, scm_c_define_subr, +scm_c_make_subr_with_generic, scm_c_define_subr_with_generic, +scm_c_make_gsubr, scm_c_define_gsubr, scm_c_make_gsubr_with_generic, +scm_c_define_gsubr_with_generic. + +** Deprecated functions: scm_make_subr, scm_make_subr_opt, + scm_make_subr_with_generic, scm_make_gsubr, + scm_make_gsubr_with_generic. + +Use the new ones from above instead. + +** C interface to the module system has changed. + +While we suggest that you avoid as many explicit module system +operations from C as possible for the time being, the C interface has +been made more similar to the high-level Scheme module system. + +*** New functions: scm_c_define_module, scm_c_use_module, + scm_c_export, scm_c_resolve_module. + +They mostly work like their Scheme namesakes. scm_c_define_module +takes a function that is called a context where the new module is +current. + +*** Deprecated functions: scm_the_root_module, scm_make_module, + scm_ensure_user_module, scm_load_scheme_module. + +Use the new functions instead. + +** Renamed function: scm_internal_with_fluids becomes + scm_c_with_fluids. + +scm_internal_with_fluids is available as a deprecated function. + +** New function: scm_c_with_fluid. + +Just like scm_c_with_fluids, but takes one fluid and one value instead +of lists of same. + +** Deprecated typedefs: long_long, ulong_long. + +They are of questionable utility and they pollute the global +namespace. + +** Deprecated typedef: scm_sizet + +It is of questionable utility now that Guile requires ANSI C, and is +oddly named. + +** Deprecated typedefs: scm_port_rw_active, scm_port, + scm_ptob_descriptor, scm_debug_info, scm_debug_frame, scm_fport, + scm_option, scm_rstate, scm_rng, scm_array, scm_array_dim. + +Made more compliant with the naming policy by adding a _t at the end. + +** Deprecated functions: scm_mkbig, scm_big2num, scm_adjbig, + scm_normbig, scm_copybig, scm_2ulong2big, scm_dbl2big, scm_big2dbl + +With the exception of the mysterious scm_2ulong2big, they are still +available under new names (scm_i_mkbig etc). These functions are not +intended to be used in user code. You should avoid dealing with +bignums directly, and should deal with numbers in general (which can +be bignums). + +** Change in behavior: scm_num2long, scm_num2ulong + +The scm_num2[u]long functions don't any longer accept an inexact +argument. This change in behavior is motivated by concordance with +R5RS: It is more common that a primitive doesn't want to accept an +inexact for an exact. + +** New functions: scm_short2num, scm_ushort2num, scm_int2num, + scm_uint2num, scm_size2num, scm_ptrdiff2num, scm_num2short, + scm_num2ushort, scm_num2int, scm_num2uint, scm_num2ptrdiff, + scm_num2size. + +These are conversion functions between the various ANSI C integral +types and Scheme numbers. NOTE: The scm_num2xxx functions don't +accept an inexact argument. + +** New functions: scm_float2num, scm_double2num, + scm_num2float, scm_num2double. + +These are conversion functions between the two ANSI C float types and +Scheme numbers. + +** New number validation macros: + SCM_NUM2{SIZE,PTRDIFF,SHORT,USHORT,INT,UINT}[_DEF] + +See above. + +** New functions: scm_gc_protect_object, scm_gc_unprotect_object + +These are just nicer-named old scm_protect_object and +scm_unprotect_object. + +** Deprecated functions: scm_protect_object, scm_unprotect_object + +** New functions: scm_gc_[un]register_root, scm_gc_[un]register_roots + +These functions can be used to register pointers to locations that +hold SCM values. + +** Deprecated function: scm_create_hook. + +Its sins are: misleading name, non-modularity and lack of general +usefulness. + + +Changes since Guile 1.3.4: + +* Changes to the distribution + +** Trees from nightly snapshots and CVS now require you to run autogen.sh. + +We've changed the way we handle generated files in the Guile source +repository. As a result, the procedure for building trees obtained +from the nightly FTP snapshots or via CVS has changed: +- You must have appropriate versions of autoconf, automake, and + libtool installed on your system. See README for info on how to + obtain these programs. +- Before configuring the tree, you must first run the script + `autogen.sh' at the top of the source tree. + +The Guile repository used to contain not only source files, written by +humans, but also some generated files, like configure scripts and +Makefile.in files. Even though the contents of these files could be +derived mechanically from other files present, we thought it would +make the tree easier to build if we checked them into CVS. + +However, this approach means that minor differences between +developer's installed tools and habits affected the whole team. +So we have removed the generated files from the repository, and +added the autogen.sh script, which will reconstruct them +appropriately. + + +** configure now has experimental options to remove support for certain +features: + +--disable-arrays omit array and uniform array support +--disable-posix omit posix interfaces +--disable-networking omit networking interfaces +--disable-regex omit regular expression interfaces + +These are likely to become separate modules some day. + +** New configure option --enable-debug-freelist + +This enables a debugging version of SCM_NEWCELL(), and also registers +an extra primitive, the setter `gc-set-debug-check-freelist!'. + +Configure with the --enable-debug-freelist option to enable +the gc-set-debug-check-freelist! primitive, and then use: + +(gc-set-debug-check-freelist! #t) # turn on checking of the freelist +(gc-set-debug-check-freelist! #f) # turn off checking + +Checking of the freelist forces a traversal of the freelist and +a garbage collection before each allocation of a cell. This can +slow down the interpreter dramatically, so the setter should be used to +turn on this extra processing only when necessary. + +** New configure option --enable-debug-malloc + +Include code for debugging of calls to scm_must_malloc/realloc/free. + +Checks that + +1. objects freed by scm_must_free has been mallocated by scm_must_malloc +2. objects reallocated by scm_must_realloc has been allocated by + scm_must_malloc +3. reallocated objects are reallocated with the same what string + +But, most importantly, it records the number of allocated objects of +each kind. This is useful when searching for memory leaks. + +A Guile compiled with this option provides the primitive +`malloc-stats' which returns an alist with pairs of kind and the +number of objects of that kind. + +** All includes are now referenced relative to the root directory + +Since some users have had problems with mixups between Guile and +system headers, we have decided to always refer to Guile headers via +their parent directories. This essentially creates a "private name +space" for Guile headers. This means that the compiler only is given +-I options for the root build and root source directory. + +** Header files kw.h and genio.h have been removed. + +** The module (ice-9 getopt-gnu-style) has been removed. + +** New module (ice-9 documentation) + +Implements the interface to documentation strings associated with +objects. + +** New module (ice-9 time) + +Provides a macro `time', which displays execution time of a given form. + +** New module (ice-9 history) + +Loading this module enables value history in the repl. + +* Changes to the stand-alone interpreter + +** New command line option --debug + +Start Guile with debugging evaluator and backtraces enabled. + +This is useful when debugging your .guile init file or scripts. + +** New help facility + +Usage: (help NAME) gives documentation about objects named NAME (a symbol) + (help REGEXP) ditto for objects with names matching REGEXP (a string) + (help 'NAME) gives documentation for NAME, even if it is not an object + (help ,EXPR) gives documentation for object returned by EXPR + (help (my module)) gives module commentary for `(my module)' + (help) gives this text + +`help' searches among bindings exported from loaded modules, while +`apropos' searches among bindings visible from the "current" module. + +Examples: (help help) + (help cons) + (help "output-string") + +** `help' and `apropos' now prints full module names + +** Dynamic linking now uses libltdl from the libtool package. + +The old system dependent code for doing dynamic linking has been +replaced with calls to the libltdl functions which do all the hairy +details for us. + +The major improvement is that you can now directly pass libtool +library names like "libfoo.la" to `dynamic-link' and `dynamic-link' +will be able to do the best shared library job you can get, via +libltdl. + +The way dynamic libraries are found has changed and is not really +portable across platforms, probably. It is therefore recommended to +use absolute filenames when possible. + +If you pass a filename without an extension to `dynamic-link', it will +try a few appropriate ones. Thus, the most platform ignorant way is +to specify a name like "libfoo", without any directories and +extensions. + +** Guile COOP threads are now compatible with LinuxThreads + +Previously, COOP threading wasn't possible in applications linked with +Linux POSIX threads due to their use of the stack pointer to find the +thread context. This has now been fixed with a workaround which uses +the pthreads to allocate the stack. + +** New primitives: `pkgdata-dir', `site-dir', `library-dir' + +** Positions of erring expression in scripts + +With version 1.3.4, the location of the erring expression in Guile +scipts is no longer automatically reported. (This should have been +documented before the 1.3.4 release.) + +You can get this information by enabling recording of positions of +source expressions and running the debugging evaluator. Put this at +the top of your script (or in your "site" file): + + (read-enable 'positions) + (debug-enable 'debug) + +** Backtraces in scripts + +It is now possible to get backtraces in scripts. + +Put + + (debug-enable 'debug 'backtrace) + +at the top of the script. + +(The first options enables the debugging evaluator. + The second enables backtraces.) + +** Part of module system symbol lookup now implemented in C + +The eval closure of most modules is now implemented in C. Since this +was one of the bottlenecks for loading speed, Guile now loads code +substantially faster than before. + +** Attempting to get the value of an unbound variable now produces +an exception with a key of 'unbound-variable instead of 'misc-error. + +** The initial default output port is now unbuffered if it's using a +tty device. Previously in this situation it was line-buffered. + +** New hook: after-gc-hook + +after-gc-hook takes over the role of gc-thunk. This hook is run at +the first SCM_TICK after a GC. (Thus, the code is run at the same +point during evaluation as signal handlers.) + +Note that this hook should be used only for diagnostic and debugging +purposes. It is not certain that it will continue to be well-defined +when this hook is run in the future. + +C programmers: Note the new C level hooks scm_before_gc_c_hook, +scm_before_sweep_c_hook, scm_after_gc_c_hook. + +** Improvements to garbage collector + +Guile 1.4 has a new policy for triggering heap allocation and +determining the sizes of heap segments. It fixes a number of problems +in the old GC. + +1. The new policy can handle two separate pools of cells + (2-word/4-word) better. (The old policy would run wild, allocating + more and more memory for certain programs.) + +2. The old code would sometimes allocate far too much heap so that the + Guile process became gigantic. The new code avoids this. + +3. The old code would sometimes allocate too little so that few cells + were freed at GC so that, in turn, too much time was spent in GC. + +4. The old code would often trigger heap allocation several times in a + row. (The new scheme predicts how large the segments needs to be + in order not to need further allocation.) + +All in all, the new GC policy will make larger applications more +efficient. + +The new GC scheme also is prepared for POSIX threading. Threads can +allocate private pools of cells ("clusters") with just a single +function call. Allocation of single cells from such a cluster can +then proceed without any need of inter-thread synchronization. + +** New environment variables controlling GC parameters + +GUILE_MAX_SEGMENT_SIZE Maximal segment size + (default = 2097000) + +Allocation of 2-word cell heaps: + +GUILE_INIT_SEGMENT_SIZE_1 Size of initial heap segment in bytes + (default = 360000) + +GUILE_MIN_YIELD_1 Minimum number of freed cells at each + GC in percent of total heap size + (default = 40) + +Allocation of 4-word cell heaps +(used for real numbers and misc other objects): + +GUILE_INIT_SEGMENT_SIZE_2, GUILE_MIN_YIELD_2 + +(See entry "Way for application to customize GC parameters" under + section "Changes to the scm_ interface" below.) + +** Guile now implements reals using 4-word cells + +This speeds up computation with reals. (They were earlier allocated +with `malloc'.) There is still some room for optimizations, however. + +** Some further steps toward POSIX thread support have been taken + +*** Guile's critical sections (SCM_DEFER/ALLOW_INTS) +don't have much effect any longer, and many of them will be removed in +next release. + +*** Signals +are only handled at the top of the evaluator loop, immediately after +I/O, and in scm_equalp. + +*** The GC can allocate thread private pools of pairs. + +* Changes to Scheme functions and syntax + +** close-input-port and close-output-port are now R5RS + +These procedures have been turned into primitives and have R5RS behaviour. + +** New procedure: simple-format PORT MESSAGE ARG1 ... + +(ice-9 boot) makes `format' an alias for `simple-format' until possibly +extended by the more sophisticated version in (ice-9 format) + +(simple-format port message . args) +Write MESSAGE to DESTINATION, defaulting to `current-output-port'. +MESSAGE can contain ~A (was %s) and ~S (was %S) escapes. When printed, +the escapes are replaced with corresponding members of ARGS: +~A formats using `display' and ~S formats using `write'. +If DESTINATION is #t, then use the `current-output-port', +if DESTINATION is #f, then return a string containing the formatted text. +Does not add a trailing newline." + +** string-ref: the second argument is no longer optional. + +** string, list->string: no longer accept strings in their arguments, +only characters, for compatibility with R5RS. + +** New procedure: port-closed? PORT +Returns #t if PORT is closed or #f if it is open. + +** Deprecated: list* + +The list* functionality is now provided by cons* (SRFI-1 compliant) + +** New procedure: cons* ARG1 ARG2 ... ARGn + +Like `list', but the last arg provides the tail of the constructed list, +returning (cons ARG1 (cons ARG2 (cons ... ARGn))). + +Requires at least one argument. If given one argument, that argument +is returned as result. + +This function is called `list*' in some other Schemes and in Common LISP. + +** Removed deprecated: serial-map, serial-array-copy!, serial-array-map! + +** New procedure: object-documentation OBJECT + +Returns the documentation string associated with OBJECT. The +procedure uses a caching mechanism so that subsequent lookups are +faster. + +Exported by (ice-9 documentation). + +** module-name now returns full names of modules + +Previously, only the last part of the name was returned (`session' for +`(ice-9 session)'). Ex: `(ice-9 session)'. + +* Changes to the gh_ interface + +** Deprecated: gh_int2scmb + +Use gh_bool2scm instead. + +* Changes to the scm_ interface + +** Guile primitives now carry docstrings! + +Thanks to Greg Badros! + +** Guile primitives are defined in a new way: SCM_DEFINE/SCM_DEFINE1/SCM_PROC + +Now Guile primitives are defined using the SCM_DEFINE/SCM_DEFINE1/SCM_PROC +macros and must contain a docstring that is extracted into foo.doc using a new +guile-doc-snarf script (that uses guile-doc-snarf.awk). + +However, a major overhaul of these macros is scheduled for the next release of +guile. + +** Guile primitives use a new technique for validation of arguments + +SCM_VALIDATE_* macros are defined to ease the redundancy and improve +the readability of argument checking. + +** All (nearly?) K&R prototypes for functions replaced with ANSI C equivalents. + +** New macros: SCM_PACK, SCM_UNPACK + +Compose/decompose an SCM value. + +The SCM type is now treated as an abstract data type and may be defined as a +long, a void* or as a struct, depending on the architecture and compile time +options. This makes it easier to find several types of bugs, for example when +SCM values are treated as integers without conversion. Values of the SCM type +should be treated as "atomic" values. These macros are used when +composing/decomposing an SCM value, either because you want to access +individual bits, or because you want to treat it as an integer value. + +E.g., in order to set bit 7 in an SCM value x, use the expression + + SCM_PACK (SCM_UNPACK (x) | 0x80) + +** The name property of hooks is deprecated. +Thus, the use of SCM_HOOK_NAME and scm_make_hook_with_name is deprecated. + +You can emulate this feature by using object properties. + +** Deprecated macros: SCM_INPORTP, SCM_OUTPORTP, SCM_CRDY, SCM_ICHRP, +SCM_ICHR, SCM_MAKICHR, SCM_SETJMPBUF, SCM_NSTRINGP, SCM_NRWSTRINGP, +SCM_NVECTORP + +These macros will be removed in a future release of Guile. + +** The following types, functions and macros from numbers.h are deprecated: +scm_dblproc, SCM_UNEGFIXABLE, SCM_FLOBUFLEN, SCM_INEXP, SCM_CPLXP, SCM_REAL, +SCM_IMAG, SCM_REALPART, scm_makdbl, SCM_SINGP, SCM_NUM2DBL, SCM_NO_BIGDIG + +** Port internals: the rw_random variable in the scm_port structure +must be set to non-zero in any random access port. In recent Guile +releases it was only set for bidirectional random-access ports. + +** Port internals: the seek ptob procedure is now responsible for +resetting the buffers if required. The change was made so that in the +special case of reading the current position (i.e., seek p 0 SEEK_CUR) +the fport and strport ptobs can avoid resetting the buffers, +in particular to avoid discarding unread chars. An existing port +type can be fixed by adding something like the following to the +beginning of the ptob seek procedure: + + if (pt->rw_active == SCM_PORT_READ) + scm_end_input (object); + else if (pt->rw_active == SCM_PORT_WRITE) + ptob->flush (object); + +although to actually avoid resetting the buffers and discard unread +chars requires further hacking that depends on the characteristics +of the ptob. + +** Deprecated functions: scm_fseek, scm_tag + +These functions are no longer used and will be removed in a future version. + +** The scm_sysmissing procedure is no longer used in libguile. +Unless it turns out to be unexpectedly useful to somebody, it will be +removed in a future version. + +** The format of error message strings has changed + +The two C procedures: scm_display_error and scm_error, as well as the +primitive `scm-error', now use scm_simple_format to do their work. +This means that the message strings of all code must be updated to use +~A where %s was used before, and ~S where %S was used before. + +During the period when there still are a lot of old Guiles out there, +you might want to support both old and new versions of Guile. + +There are basically two methods to achieve this. Both methods use +autoconf. Put + + AC_CHECK_FUNCS(scm_simple_format) + +in your configure.in. + +Method 1: Use the string concatenation features of ANSI C's + preprocessor. + +In C: + +#ifdef HAVE_SCM_SIMPLE_FORMAT +#define FMT_S "~S" +#else +#define FMT_S "%S" +#endif + +Then represent each of your error messages using a preprocessor macro: + +#define E_SPIDER_ERROR "There's a spider in your " ## FMT_S ## "!!!" + +In Scheme: + +(define fmt-s (if (defined? 'simple-format) "~S" "%S")) +(define make-message string-append) + +(define e-spider-error (make-message "There's a spider in your " fmt-s "!!!")) + +Method 2: Use the oldfmt function found in doc/oldfmt.c. + +In C: + +scm_misc_error ("picnic", scm_c_oldfmt0 ("There's a spider in your ~S!!!"), + ...); + +In Scheme: + +(scm-error 'misc-error "picnic" (oldfmt "There's a spider in your ~S!!!") + ...) + + +** Deprecated: coop_mutex_init, coop_condition_variable_init + +Don't use the functions coop_mutex_init and +coop_condition_variable_init. They will change. + +Use scm_mutex_init and scm_cond_init instead. + +** New function: int scm_cond_timedwait (scm_cond_t *COND, scm_mutex_t *MUTEX, const struct timespec *ABSTIME) + `scm_cond_timedwait' atomically unlocks MUTEX and waits on + COND, as `scm_cond_wait' does, but it also bounds the duration + of the wait. If COND has not been signaled before time ABSTIME, + the mutex MUTEX is re-acquired and `scm_cond_timedwait' + returns the error code `ETIMEDOUT'. + + The ABSTIME parameter specifies an absolute time, with the same + origin as `time' and `gettimeofday': an ABSTIME of 0 corresponds + to 00:00:00 GMT, January 1, 1970. + +** New function: scm_cond_broadcast (scm_cond_t *COND) + `scm_cond_broadcast' restarts all the threads that are waiting + on the condition variable COND. Nothing happens if no threads are + waiting on COND. + +** New function: scm_key_create (scm_key_t *KEY, void (*destr_function) (void *)) + `scm_key_create' allocates a new TSD key. The key is stored in + the location pointed to by KEY. There is no limit on the number + of keys allocated at a given time. The value initially associated + with the returned key is `NULL' in all currently executing threads. + + The DESTR_FUNCTION argument, if not `NULL', specifies a destructor + function associated with the key. When a thread terminates, + DESTR_FUNCTION is called on the value associated with the key in + that thread. The DESTR_FUNCTION is not called if a key is deleted + with `scm_key_delete' or a value is changed with + `scm_setspecific'. The order in which destructor functions are + called at thread termination time is unspecified. + + Destructors are not yet implemented. + +** New function: scm_setspecific (scm_key_t KEY, const void *POINTER) + `scm_setspecific' changes the value associated with KEY in the + calling thread, storing the given POINTER instead. + +** New function: scm_getspecific (scm_key_t KEY) + `scm_getspecific' returns the value currently associated with + KEY in the calling thread. + +** New function: scm_key_delete (scm_key_t KEY) + `scm_key_delete' deallocates a TSD key. It does not check + whether non-`NULL' values are associated with that key in the + currently executing threads, nor call the destructor function + associated with the key. + +** New function: scm_c_hook_init (scm_c_hook_t *HOOK, void *HOOK_DATA, scm_c_hook_type_t TYPE) + +Initialize a C level hook HOOK with associated HOOK_DATA and type +TYPE. (See scm_c_hook_run ().) + +** New function: scm_c_hook_add (scm_c_hook_t *HOOK, scm_c_hook_function_t FUNC, void *FUNC_DATA, int APPENDP) + +Add hook function FUNC with associated FUNC_DATA to HOOK. If APPENDP +is true, add it last, otherwise first. The same FUNC can be added +multiple times if FUNC_DATA differ and vice versa. + +** New function: scm_c_hook_remove (scm_c_hook_t *HOOK, scm_c_hook_function_t FUNC, void *FUNC_DATA) + +Remove hook function FUNC with associated FUNC_DATA from HOOK. A +function is only removed if both FUNC and FUNC_DATA matches. + +** New function: void *scm_c_hook_run (scm_c_hook_t *HOOK, void *DATA) + +Run hook HOOK passing DATA to the hook functions. + +If TYPE is SCM_C_HOOK_NORMAL, all hook functions are run. The value +returned is undefined. + +If TYPE is SCM_C_HOOK_OR, hook functions are run until a function +returns a non-NULL value. This value is returned as the result of +scm_c_hook_run. If all functions return NULL, NULL is returned. + +If TYPE is SCM_C_HOOK_AND, hook functions are run until a function +returns a NULL value, and NULL is returned. If all functions returns +a non-NULL value, the last value is returned. + +** New C level GC hooks + +Five new C level hooks has been added to the garbage collector. + + scm_before_gc_c_hook + scm_after_gc_c_hook + +are run before locking and after unlocking the heap. The system is +thus in a mode where evaluation can take place. (Except that +scm_before_gc_c_hook must not allocate new cells.) + + scm_before_mark_c_hook + scm_before_sweep_c_hook + scm_after_sweep_c_hook + +are run when the heap is locked. These are intended for extension of +the GC in a modular fashion. Examples are the weaks and guardians +modules. + +** Way for application to customize GC parameters + +The application can set up other default values for the GC heap +allocation parameters + + GUILE_INIT_HEAP_SIZE_1, GUILE_MIN_YIELD_1, + GUILE_INIT_HEAP_SIZE_2, GUILE_MIN_YIELD_2, + GUILE_MAX_SEGMENT_SIZE, + +by setting + + scm_default_init_heap_size_1, scm_default_min_yield_1, + scm_default_init_heap_size_2, scm_default_min_yield_2, + scm_default_max_segment_size + +respectively before callong scm_boot_guile. + +(See entry "New environment variables ..." in section +"Changes to the stand-alone interpreter" above.) + +** scm_protect_object/scm_unprotect_object now nest + +This means that you can call scm_protect_object multiple times on an +object and count on the object being protected until +scm_unprotect_object has been call the same number of times. + +The functions also have better time complexity. + +Still, it is usually possible to structure the application in a way +that you don't need to use these functions. For example, if you use a +protected standard Guile list to keep track of live objects rather +than some custom data type, objects will die a natural death when they +are no longer needed. + +** Deprecated type tags: scm_tc16_flo, scm_tc_flo, scm_tc_dblr, scm_tc_dblc + +Guile does not provide the float representation for inexact real numbers any +more. Now, only doubles are used to represent inexact real numbers. Further, +the tag names scm_tc_dblr and scm_tc_dblc have been changed to scm_tc16_real +and scm_tc16_complex, respectively. + +** Removed deprecated type scm_smobfuns + +** Removed deprecated function scm_newsmob + +** Warning: scm_make_smob_type_mfpe might become deprecated in a future release + +There is an ongoing discussion among the developers whether to +deprecate `scm_make_smob_type_mfpe' or not. Please use the current +standard interface (scm_make_smob_type, scm_set_smob_XXX) in new code +until this issue has been settled. + +** Removed deprecated type tag scm_tc16_kw + +** Added type tag scm_tc16_keyword + +(This was introduced already in release 1.3.4 but was not documented + until now.) + +** gdb_print now prints "*** Guile not initialized ***" until Guile initialized + +* Changes to system call interfaces: + +** The "select" procedure now tests port buffers for the ability to +provide input or accept output. Previously only the underlying file +descriptors were checked. + +** New variable PIPE_BUF: the maximum number of bytes that can be +atomically written to a pipe. + +** If a facility is not available on the system when Guile is +compiled, the corresponding primitive procedure will not be defined. +Previously it would have been defined but would throw a system-error +exception if called. Exception handlers which catch this case may +need minor modification: an error will be thrown with key +'unbound-variable instead of 'system-error. Alternatively it's +now possible to use `defined?' to check whether the facility is +available. + +** Procedures which depend on the timezone should now give the correct +result on systems which cache the TZ environment variable, even if TZ +is changed without calling tzset. + +* Changes to the networking interfaces: + +** New functions: htons, ntohs, htonl, ntohl: for converting short and +long integers between network and host format. For now, it's not +particularly convenient to do this kind of thing, but consider: + +(define write-network-long + (lambda (value port) + (let ((v (make-uniform-vector 1 1 0))) + (uniform-vector-set! v 0 (htonl value)) + (uniform-vector-write v port)))) + +(define read-network-long + (lambda (port) + (let ((v (make-uniform-vector 1 1 0))) + (uniform-vector-read! v port) + (ntohl (uniform-vector-ref v 0))))) + +** If inet-aton fails, it now throws an error with key 'misc-error +instead of 'system-error, since errno is not relevant. + +** Certain gethostbyname/gethostbyaddr failures now throw errors with +specific keys instead of 'system-error. The latter is inappropriate +since errno will not have been set. The keys are: +'host-not-found, 'try-again, 'no-recovery and 'no-data. + +** sethostent, setnetent, setprotoent, setservent: now take an +optional argument STAYOPEN, which specifies whether the database +remains open after a database entry is accessed randomly (e.g., using +gethostbyname for the hosts database.) The default is #f. Previously +#t was always used. + + +Changes since Guile 1.3.2: + +* Changes to the stand-alone interpreter + +** Debugger + +An initial version of the Guile debugger written by Chris Hanson has +been added. The debugger is still under development but is included +in the distribution anyway since it is already quite useful. + +Type + + (debug) + +after an error to enter the debugger. Type `help' inside the debugger +for a description of available commands. + +If you prefer to have stack frames numbered and printed in +anti-chronological order and prefer up in the stack to be down on the +screen as is the case in gdb, you can put + + (debug-enable 'backwards) + +in your .guile startup file. (However, this means that Guile can't +use indentation to indicate stack level.) + +The debugger is autoloaded into Guile at the first use. + +** Further enhancements to backtraces + +There is a new debug option `width' which controls the maximum width +on the screen of printed stack frames. Fancy printing parameters +("level" and "length" as in Common LISP) are adaptively adjusted for +each stack frame to give maximum information while still fitting +within the bounds. If the stack frame can't be made to fit by +adjusting parameters, it is simply cut off at the end. This is marked +with a `$'. + +** Some modules are now only loaded when the repl is started + +The modules (ice-9 debug), (ice-9 session), (ice-9 threads) and (ice-9 +regex) are now loaded into (guile-user) only if the repl has been +started. The effect is that the startup time for scripts has been +reduced to 30% of what it was previously. + +Correctly written scripts load the modules they require at the top of +the file and should not be affected by this change. + +** Hooks are now represented as smobs + +* Changes to Scheme functions and syntax + +** Readline support has changed again. + +The old (readline-activator) module is gone. Use (ice-9 readline) +instead, which now contains all readline functionality. So the code +to activate readline is now + + (use-modules (ice-9 readline)) + (activate-readline) + +This should work at any time, including from the guile prompt. + +To avoid confusion about the terms of Guile's license, please only +enable readline for your personal use; please don't make it the +default for others. Here is why we make this rather odd-sounding +request: + +Guile is normally licensed under a weakened form of the GNU General +Public License, which allows you to link code with Guile without +placing that code under the GPL. This exception is important to some +people. + +However, since readline is distributed under the GNU General Public +License, when you link Guile with readline, either statically or +dynamically, you effectively change Guile's license to the strict GPL. +Whenever you link any strictly GPL'd code into Guile, uses of Guile +which are normally permitted become forbidden. This is a rather +non-obvious consequence of the licensing terms. + +So, to make sure things remain clear, please let people choose for +themselves whether to link GPL'd libraries like readline with Guile. + +** regexp-substitute/global has changed slightly, but incompatibly. + +If you include a function in the item list, the string of the match +object it receives is the same string passed to +regexp-substitute/global, not some suffix of that string. +Correspondingly, the match's positions are relative to the entire +string, not the suffix. + +If the regexp can match the empty string, the way matches are chosen +from the string has changed. regexp-substitute/global recognizes the +same set of matches that list-matches does; see below. + +** New function: list-matches REGEXP STRING [FLAGS] + +Return a list of match objects, one for every non-overlapping, maximal +match of REGEXP in STRING. The matches appear in left-to-right order. +list-matches only reports matches of the empty string if there are no +other matches which begin on, end at, or include the empty match's +position. + +If present, FLAGS is passed as the FLAGS argument to regexp-exec. + +** New function: fold-matches REGEXP STRING INIT PROC [FLAGS] + +For each match of REGEXP in STRING, apply PROC to the match object, +and the last value PROC returned, or INIT for the first call. Return +the last value returned by PROC. We apply PROC to the matches as they +appear from left to right. + +This function recognizes matches according to the same criteria as +list-matches. + +Thus, you could define list-matches like this: + + (define (list-matches regexp string . flags) + (reverse! (apply fold-matches regexp string '() cons flags))) + +If present, FLAGS is passed as the FLAGS argument to regexp-exec. + +** Hooks + +*** New function: hook? OBJ + +Return #t if OBJ is a hook, otherwise #f. + +*** New function: make-hook-with-name NAME [ARITY] + +Return a hook with name NAME and arity ARITY. The default value for +ARITY is 0. The only effect of NAME is that it will appear when the +hook object is printed to ease debugging. + +*** New function: hook-empty? HOOK + +Return #t if HOOK doesn't contain any procedures, otherwise #f. + +*** New function: hook->list HOOK + +Return a list of the procedures that are called when run-hook is +applied to HOOK. + +** `map' signals an error if its argument lists are not all the same length. + +This is the behavior required by R5RS, so this change is really a bug +fix. But it seems to affect a lot of people's code, so we're +mentioning it here anyway. + +** Print-state handling has been made more transparent + +Under certain circumstances, ports are represented as a port with an +associated print state. Earlier, this pair was represented as a pair +(see "Some magic has been added to the printer" below). It is now +indistinguishable (almost; see `get-print-state') from a port on the +user level. + +*** New function: port-with-print-state OUTPUT-PORT PRINT-STATE + +Return a new port with the associated print state PRINT-STATE. + +*** New function: get-print-state OUTPUT-PORT + +Return the print state associated with this port if it exists, +otherwise return #f. + +*** New function: directory-stream? OBJECT + +Returns true iff OBJECT is a directory stream --- the sort of object +returned by `opendir'. + +** New function: using-readline? + +Return #t if readline is in use in the current repl. + +** structs will be removed in 1.4 + +Structs will be replaced in Guile 1.4. We will merge GOOPS into Guile +and use GOOPS objects as the fundamental record type. + +* Changes to the scm_ interface + +** structs will be removed in 1.4 + +The entire current struct interface (struct.c, struct.h) will be +replaced in Guile 1.4. We will merge GOOPS into libguile and use +GOOPS objects as the fundamental record type. + +** The internal representation of subr's has changed + +Instead of giving a hint to the subr name, the CAR field of the subr +now contains an index to a subr entry in scm_subr_table. + +*** New variable: scm_subr_table + +An array of subr entries. A subr entry contains the name, properties +and documentation associated with the subr. The properties and +documentation slots are not yet used. + +** A new scheme for "forwarding" calls to a builtin to a generic function + +It is now possible to extend the functionality of some Guile +primitives by letting them defer a call to a GOOPS generic function on +argument mismatch. This means that there is no loss of efficiency in +normal evaluation. + +Example: + + (use-modules (oop goops)) ; Must be GOOPS version 0.2. + (define-method + ((x ) (y )) + (string-append x y)) + ++ will still be as efficient as usual in numerical calculations, but +can also be used for concatenating strings. + +Who will be the first one to extend Guile's numerical tower to +rationals? :) [OK, there a few other things to fix before this can +be made in a clean way.] + +*** New snarf macros for defining primitives: SCM_GPROC, SCM_GPROC1 + + New macro: SCM_GPROC (CNAME, SNAME, REQ, OPT, VAR, CFUNC, GENERIC) + + New macro: SCM_GPROC1 (CNAME, SNAME, TYPE, CFUNC, GENERIC) + +These do the same job as SCM_PROC and SCM_PROC1, but they also define +a variable GENERIC which can be used by the dispatch macros below. + +[This is experimental code which may change soon.] + +*** New macros for forwarding control to a generic on arg type error + + New macro: SCM_WTA_DISPATCH_1 (GENERIC, ARG1, POS, SUBR) + + New macro: SCM_WTA_DISPATCH_2 (GENERIC, ARG1, ARG2, POS, SUBR) + +These correspond to the scm_wta function call, and have the same +behaviour until the user has called the GOOPS primitive +`enable-primitive-generic!'. After that, these macros will apply the +generic function GENERIC to the argument(s) instead of calling +scm_wta. + +[This is experimental code which may change soon.] + +*** New macros for argument testing with generic dispatch + + New macro: SCM_GASSERT1 (COND, GENERIC, ARG1, POS, SUBR) + + New macro: SCM_GASSERT2 (COND, GENERIC, ARG1, ARG2, POS, SUBR) + +These correspond to the SCM_ASSERT macro, but will defer control to +GENERIC on error after `enable-primitive-generic!' has been called. + +[This is experimental code which may change soon.] + +** New function: SCM scm_eval_body (SCM body, SCM env) + +Evaluates the body of a special form. + +** The internal representation of struct's has changed + +Previously, four slots were allocated for the procedure(s) of entities +and operators. The motivation for this representation had to do with +the structure of the evaluator, the wish to support tail-recursive +generic functions, and efficiency. Since the generic function +dispatch mechanism has changed, there is no longer a need for such an +expensive representation, and the representation has been simplified. + +This should not make any difference for most users. + +** GOOPS support has been cleaned up. + +Some code has been moved from eval.c to objects.c and code in both of +these compilation units has been cleaned up and better structured. + +*** New functions for applying generic functions + + New function: SCM scm_apply_generic (GENERIC, ARGS) + New function: SCM scm_call_generic_0 (GENERIC) + New function: SCM scm_call_generic_1 (GENERIC, ARG1) + New function: SCM scm_call_generic_2 (GENERIC, ARG1, ARG2) + New function: SCM scm_call_generic_3 (GENERIC, ARG1, ARG2, ARG3) + +** Deprecated function: scm_make_named_hook + +It is now replaced by: + +** New function: SCM scm_create_hook (const char *name, int arity) + +Creates a hook in the same way as make-hook above but also +binds a variable named NAME to it. + +This is the typical way of creating a hook from C code. + +Currently, the variable is created in the "current" module. +This might change when we get the new module system. + +[The behaviour is identical to scm_make_named_hook.] + + + +Changes since Guile 1.3: + +* Changes to mailing lists + +** Some of the Guile mailing lists have moved to sourceware.cygnus.com. + +See the README file to find current addresses for all the Guile +mailing lists. + +* Changes to the distribution + +** Readline support is no longer included with Guile by default. + +Based on the different license terms of Guile and Readline, we +concluded that Guile should not *by default* cause the linking of +Readline into an application program. Readline support is now offered +as a separate module, which is linked into an application only when +you explicitly specify it. + +Although Guile is GNU software, its distribution terms add a special +exception to the usual GNU General Public License (GPL). Guile's +license includes a clause that allows you to link Guile with non-free +programs. We add this exception so as not to put Guile at a +disadvantage vis-a-vis other extensibility packages that support other +languages. + +In contrast, the GNU Readline library is distributed under the GNU +General Public License pure and simple. This means that you may not +link Readline, even dynamically, into an application unless it is +distributed under a free software license that is compatible the GPL. + +Because of this difference in distribution terms, an application that +can use Guile may not be able to use Readline. Now users will be +explicitly offered two independent decisions about the use of these +two packages. + +You can activate the readline support by issuing + + (use-modules (readline-activator)) + (activate-readline) + +from your ".guile" file, for example. + +* Changes to the stand-alone interpreter + +** All builtins now print as primitives. +Previously builtin procedures not belonging to the fundamental subr +types printed as #>. +Now, they print as #. + +** Backtraces slightly more intelligible. +gsubr-apply and macro transformer application frames no longer appear +in backtraces. + +* Changes to Scheme functions and syntax + +** Guile now correctly handles internal defines by rewriting them into +their equivalent letrec. Previously, internal defines would +incrementally add to the innermost environment, without checking +whether the restrictions specified in RnRS were met. This lead to the +correct behaviour when these restriction actually were met, but didn't +catch all illegal uses. Such an illegal use could lead to crashes of +the Guile interpreter or or other unwanted results. An example of +incorrect internal defines that made Guile behave erratically: + + (let () + (define a 1) + (define (b) a) + (define c (1+ (b))) + (define d 3) + + (b)) + + => 2 + +The problem with this example is that the definition of `c' uses the +value of `b' directly. This confuses the meoization machine of Guile +so that the second call of `b' (this time in a larger environment that +also contains bindings for `c' and `d') refers to the binding of `c' +instead of `a'. You could also make Guile crash with a variation on +this theme: + + (define (foo flag) + (define a 1) + (define (b flag) (if flag a 1)) + (define c (1+ (b flag))) + (define d 3) + + (b #t)) + + (foo #f) + (foo #t) + +From now on, Guile will issue an `Unbound variable: b' error message +for both examples. + +** Hooks + +A hook contains a list of functions which should be called on +particular occasions in an existing program. Hooks are used for +customization. + +A window manager might have a hook before-window-map-hook. The window +manager uses the function run-hooks to call all functions stored in +before-window-map-hook each time a window is mapped. The user can +store functions in the hook using add-hook!. + +In Guile, hooks are first class objects. + +*** New function: make-hook [N_ARGS] + +Return a hook for hook functions which can take N_ARGS arguments. +The default value for N_ARGS is 0. + +(See also scm_make_named_hook below.) + +*** New function: add-hook! HOOK PROC [APPEND_P] + +Put PROC at the beginning of the list of functions stored in HOOK. +If APPEND_P is supplied, and non-false, put PROC at the end instead. + +PROC must be able to take the number of arguments specified when the +hook was created. + +If PROC already exists in HOOK, then remove it first. + +*** New function: remove-hook! HOOK PROC + +Remove PROC from the list of functions in HOOK. + +*** New function: reset-hook! HOOK + +Clear the list of hook functions stored in HOOK. + +*** New function: run-hook HOOK ARG1 ... + +Run all hook functions stored in HOOK with arguments ARG1 ... . +The number of arguments supplied must correspond to the number given +when the hook was created. + +** The function `dynamic-link' now takes optional keyword arguments. + The only keyword argument that is currently defined is `:global + BOOL'. With it, you can control whether the shared library will be + linked in global mode or not. In global mode, the symbols from the + linked library can be used to resolve references from other + dynamically linked libraries. In non-global mode, the linked + library is essentially invisible and can only be accessed via + `dynamic-func', etc. The default is now to link in global mode. + Previously, the default has been non-global mode. + + The `#:global' keyword is only effective on platforms that support + the dlopen family of functions. + +** New function `provided?' + + - Function: provided? FEATURE + Return true iff FEATURE is supported by this installation of + Guile. FEATURE must be a symbol naming a feature; the global + variable `*features*' is a list of available features. + +** Changes to the module (ice-9 expect): + +*** The expect-strings macro now matches `$' in a regular expression + only at a line-break or end-of-file by default. Previously it would + match the end of the string accumulated so far. The old behaviour + can be obtained by setting the variable `expect-strings-exec-flags' + to 0. + +*** The expect-strings macro now uses a variable `expect-strings-exec-flags' + for the regexp-exec flags. If `regexp/noteol' is included, then `$' + in a regular expression will still match before a line-break or + end-of-file. The default is `regexp/noteol'. + +*** The expect-strings macro now uses a variable + `expect-strings-compile-flags' for the flags to be supplied to + `make-regexp'. The default is `regexp/newline', which was previously + hard-coded. + +*** The expect macro now supplies two arguments to a match procedure: + the current accumulated string and a flag to indicate whether + end-of-file has been reached. Previously only the string was supplied. + If end-of-file is reached, the match procedure will be called an + additional time with the same accumulated string as the previous call + but with the flag set. + +** New module (ice-9 format), implementing the Common Lisp `format' function. + +This code, and the documentation for it that appears here, was +borrowed from SLIB, with minor adaptations for Guile. + + - Function: format DESTINATION FORMAT-STRING . ARGUMENTS + An almost complete implementation of Common LISP format description + according to the CL reference book `Common LISP' from Guy L. + Steele, Digital Press. Backward compatible to most of the + available Scheme format implementations. + + Returns `#t', `#f' or a string; has side effect of printing + according to FORMAT-STRING. If DESTINATION is `#t', the output is + to the current output port and `#t' is returned. If DESTINATION + is `#f', a formatted string is returned as the result of the call. + NEW: If DESTINATION is a string, DESTINATION is regarded as the + format string; FORMAT-STRING is then the first argument and the + output is returned as a string. If DESTINATION is a number, the + output is to the current error port if available by the + implementation. Otherwise DESTINATION must be an output port and + `#t' is returned. + + FORMAT-STRING must be a string. In case of a formatting error + format returns `#f' and prints a message on the current output or + error port. Characters are output as if the string were output by + the `display' function with the exception of those prefixed by a + tilde (~). For a detailed description of the FORMAT-STRING syntax + please consult a Common LISP format reference manual. For a test + suite to verify this format implementation load `formatst.scm'. + Please send bug reports to `lutzeb@cs.tu-berlin.de'. + + Note: `format' is not reentrant, i.e. only one `format'-call may + be executed at a time. + + +*** Format Specification (Format version 3.0) + + Please consult a Common LISP format reference manual for a detailed +description of the format string syntax. For a demonstration of the +implemented directives see `formatst.scm'. + + This implementation supports directive parameters and modifiers (`:' +and `@' characters). Multiple parameters must be separated by a comma +(`,'). Parameters can be numerical parameters (positive or negative), +character parameters (prefixed by a quote character (`''), variable +parameters (`v'), number of rest arguments parameter (`#'), empty and +default parameters. Directive characters are case independent. The +general form of a directive is: + +DIRECTIVE ::= ~{DIRECTIVE-PARAMETER,}[:][@]DIRECTIVE-CHARACTER + +DIRECTIVE-PARAMETER ::= [ [-|+]{0-9}+ | 'CHARACTER | v | # ] + +*** Implemented CL Format Control Directives + + Documentation syntax: Uppercase characters represent the +corresponding control directive characters. Lowercase characters +represent control directive parameter descriptions. + +`~A' + Any (print as `display' does). + `~@A' + left pad. + + `~MINCOL,COLINC,MINPAD,PADCHARA' + full padding. + +`~S' + S-expression (print as `write' does). + `~@S' + left pad. + + `~MINCOL,COLINC,MINPAD,PADCHARS' + full padding. + +`~D' + Decimal. + `~@D' + print number sign always. + + `~:D' + print comma separated. + + `~MINCOL,PADCHAR,COMMACHARD' + padding. + +`~X' + Hexadecimal. + `~@X' + print number sign always. + + `~:X' + print comma separated. + + `~MINCOL,PADCHAR,COMMACHARX' + padding. + +`~O' + Octal. + `~@O' + print number sign always. + + `~:O' + print comma separated. + + `~MINCOL,PADCHAR,COMMACHARO' + padding. + +`~B' + Binary. + `~@B' + print number sign always. + + `~:B' + print comma separated. + + `~MINCOL,PADCHAR,COMMACHARB' + padding. + +`~NR' + Radix N. + `~N,MINCOL,PADCHAR,COMMACHARR' + padding. + +`~@R' + print a number as a Roman numeral. + +`~:@R' + print a number as an "old fashioned" Roman numeral. + +`~:R' + print a number as an ordinal English number. + +`~:@R' + print a number as a cardinal English number. + +`~P' + Plural. + `~@P' + prints `y' and `ies'. + + `~:P' + as `~P but jumps 1 argument backward.' + + `~:@P' + as `~@P but jumps 1 argument backward.' + +`~C' + Character. + `~@C' + prints a character as the reader can understand it (i.e. `#\' + prefixing). + + `~:C' + prints a character as emacs does (eg. `^C' for ASCII 03). + +`~F' + Fixed-format floating-point (prints a flonum like MMM.NNN). + `~WIDTH,DIGITS,SCALE,OVERFLOWCHAR,PADCHARF' + `~@F' + If the number is positive a plus sign is printed. + +`~E' + Exponential floating-point (prints a flonum like MMM.NNN`E'EE). + `~WIDTH,DIGITS,EXPONENTDIGITS,SCALE,OVERFLOWCHAR,PADCHAR,EXPONENTCHARE' + `~@E' + If the number is positive a plus sign is printed. + +`~G' + General floating-point (prints a flonum either fixed or + exponential). + `~WIDTH,DIGITS,EXPONENTDIGITS,SCALE,OVERFLOWCHAR,PADCHAR,EXPONENTCHARG' + `~@G' + If the number is positive a plus sign is printed. + +`~$' + Dollars floating-point (prints a flonum in fixed with signs + separated). + `~DIGITS,SCALE,WIDTH,PADCHAR$' + `~@$' + If the number is positive a plus sign is printed. + + `~:@$' + A sign is always printed and appears before the padding. + + `~:$' + The sign appears before the padding. + +`~%' + Newline. + `~N%' + print N newlines. + +`~&' + print newline if not at the beginning of the output line. + `~N&' + prints `~&' and then N-1 newlines. + +`~|' + Page Separator. + `~N|' + print N page separators. + +`~~' + Tilde. + `~N~' + print N tildes. + +`~' + Continuation Line. + `~:' + newline is ignored, white space left. + + `~@' + newline is left, white space ignored. + +`~T' + Tabulation. + `~@T' + relative tabulation. + + `~COLNUM,COLINCT' + full tabulation. + +`~?' + Indirection (expects indirect arguments as a list). + `~@?' + extracts indirect arguments from format arguments. + +`~(STR~)' + Case conversion (converts by `string-downcase'). + `~:(STR~)' + converts by `string-capitalize'. + + `~@(STR~)' + converts by `string-capitalize-first'. + + `~:@(STR~)' + converts by `string-upcase'. + +`~*' + Argument Jumping (jumps 1 argument forward). + `~N*' + jumps N arguments forward. + + `~:*' + jumps 1 argument backward. + + `~N:*' + jumps N arguments backward. + + `~@*' + jumps to the 0th argument. + + `~N@*' + jumps to the Nth argument (beginning from 0) + +`~[STR0~;STR1~;...~;STRN~]' + Conditional Expression (numerical clause conditional). + `~N[' + take argument from N. + + `~@[' + true test conditional. + + `~:[' + if-else-then conditional. + + `~;' + clause separator. + + `~:;' + default clause follows. + +`~{STR~}' + Iteration (args come from the next argument (a list)). + `~N{' + at most N iterations. + + `~:{' + args from next arg (a list of lists). + + `~@{' + args from the rest of arguments. + + `~:@{' + args from the rest args (lists). + +`~^' + Up and out. + `~N^' + aborts if N = 0 + + `~N,M^' + aborts if N = M + + `~N,M,K^' + aborts if N <= M <= K + +*** Not Implemented CL Format Control Directives + +`~:A' + print `#f' as an empty list (see below). + +`~:S' + print `#f' as an empty list (see below). + +`~<~>' + Justification. + +`~:^' + (sorry I don't understand its semantics completely) + +*** Extended, Replaced and Additional Control Directives + +`~MINCOL,PADCHAR,COMMACHAR,COMMAWIDTHD' +`~MINCOL,PADCHAR,COMMACHAR,COMMAWIDTHX' +`~MINCOL,PADCHAR,COMMACHAR,COMMAWIDTHO' +`~MINCOL,PADCHAR,COMMACHAR,COMMAWIDTHB' +`~N,MINCOL,PADCHAR,COMMACHAR,COMMAWIDTHR' + COMMAWIDTH is the number of characters between two comma + characters. + +`~I' + print a R4RS complex number as `~F~@Fi' with passed parameters for + `~F'. + +`~Y' + Pretty print formatting of an argument for scheme code lists. + +`~K' + Same as `~?.' + +`~!' + Flushes the output if format DESTINATION is a port. + +`~_' + Print a `#\space' character + `~N_' + print N `#\space' characters. + +`~/' + Print a `#\tab' character + `~N/' + print N `#\tab' characters. + +`~NC' + Takes N as an integer representation for a character. No arguments + are consumed. N is converted to a character by `integer->char'. N + must be a positive decimal number. + +`~:S' + Print out readproof. Prints out internal objects represented as + `#<...>' as strings `"#<...>"' so that the format output can always + be processed by `read'. + +`~:A' + Print out readproof. Prints out internal objects represented as + `#<...>' as strings `"#<...>"' so that the format output can always + be processed by `read'. + +`~Q' + Prints information and a copyright notice on the format + implementation. + `~:Q' + prints format version. + +`~F, ~E, ~G, ~$' + may also print number strings, i.e. passing a number as a string + and format it accordingly. + +*** Configuration Variables + + The format module exports some configuration variables to suit the +systems and users needs. There should be no modification necessary for +the configuration that comes with Guile. Format detects automatically +if the running scheme system implements floating point numbers and +complex numbers. + +format:symbol-case-conv + Symbols are converted by `symbol->string' so the case type of the + printed symbols is implementation dependent. + `format:symbol-case-conv' is a one arg closure which is either + `#f' (no conversion), `string-upcase', `string-downcase' or + `string-capitalize'. (default `#f') + +format:iobj-case-conv + As FORMAT:SYMBOL-CASE-CONV but applies for the representation of + implementation internal objects. (default `#f') + +format:expch + The character prefixing the exponent value in `~E' printing. + (default `#\E') + +*** Compatibility With Other Format Implementations + +SLIB format 2.x: + See `format.doc'. + +SLIB format 1.4: + Downward compatible except for padding support and `~A', `~S', + `~P', `~X' uppercase printing. SLIB format 1.4 uses C-style + `printf' padding support which is completely replaced by the CL + `format' padding style. + +MIT C-Scheme 7.1: + Downward compatible except for `~', which is not documented + (ignores all characters inside the format string up to a newline + character). (7.1 implements `~a', `~s', ~NEWLINE, `~~', `~%', + numerical and variable parameters and `:/@' modifiers in the CL + sense). + +Elk 1.5/2.0: + Downward compatible except for `~A' and `~S' which print in + uppercase. (Elk implements `~a', `~s', `~~', and `~%' (no + directive parameters or modifiers)). + +Scheme->C 01nov91: + Downward compatible except for an optional destination parameter: + S2C accepts a format call without a destination which returns a + formatted string. This is equivalent to a #f destination in S2C. + (S2C implements `~a', `~s', `~c', `~%', and `~~' (no directive + parameters or modifiers)). + + +** Changes to string-handling functions. + +These functions were added to support the (ice-9 format) module, above. + +*** New function: string-upcase STRING +*** New function: string-downcase STRING + +These are non-destructive versions of the existing string-upcase! and +string-downcase! functions. + +*** New function: string-capitalize! STRING +*** New function: string-capitalize STRING + +These functions convert the first letter of each word in the string to +upper case. Thus: + + (string-capitalize "howdy there") + => "Howdy There" + +As with the other functions, string-capitalize! modifies the string in +place, while string-capitalize returns a modified copy of its argument. + +*** New function: string-ci->symbol STRING + +Return a symbol whose name is STRING, but having the same case as if +the symbol had be read by `read'. + +Guile can be configured to be sensitive or insensitive to case +differences in Scheme identifiers. If Guile is case-insensitive, all +symbols are converted to lower case on input. The `string-ci->symbol' +function returns a symbol whose name in STRING, transformed as Guile +would if STRING were input. + +*** New function: substring-move! STRING1 START END STRING2 START + +Copy the substring of STRING1 from START (inclusive) to END +(exclusive) to STRING2 at START. STRING1 and STRING2 may be the same +string, and the source and destination areas may overlap; in all +cases, the function behaves as if all the characters were copied +simultanously. + +*** Extended functions: substring-move-left! substring-move-right! + +These functions now correctly copy arbitrarily overlapping substrings; +they are both synonyms for substring-move!. + + +** New module (ice-9 getopt-long), with the function `getopt-long'. + +getopt-long is a function for parsing command-line arguments in a +manner consistent with other GNU programs. + +(getopt-long ARGS GRAMMAR) +Parse the arguments ARGS according to the argument list grammar GRAMMAR. + +ARGS should be a list of strings. Its first element should be the +name of the program; subsequent elements should be the arguments +that were passed to the program on the command line. The +`program-arguments' procedure returns a list of this form. + +GRAMMAR is a list of the form: +((OPTION (PROPERTY VALUE) ...) ...) + +Each OPTION should be a symbol. `getopt-long' will accept a +command-line option named `--OPTION'. +Each option can have the following (PROPERTY VALUE) pairs: + + (single-char CHAR) --- Accept `-CHAR' as a single-character + equivalent to `--OPTION'. This is how to specify traditional + Unix-style flags. + (required? BOOL) --- If BOOL is true, the option is required. + getopt-long will raise an error if it is not found in ARGS. + (value BOOL) --- If BOOL is #t, the option accepts a value; if + it is #f, it does not; and if it is the symbol + `optional', the option may appear in ARGS with or + without a value. + (predicate FUNC) --- If the option accepts a value (i.e. you + specified `(value #t)' for this option), then getopt + will apply FUNC to the value, and throw an exception + if it returns #f. FUNC should be a procedure which + accepts a string and returns a boolean value; you may + need to use quasiquotes to get it into GRAMMAR. + +The (PROPERTY VALUE) pairs may occur in any order, but each +property may occur only once. By default, options do not have +single-character equivalents, are not required, and do not take +values. + +In ARGS, single-character options may be combined, in the usual +Unix fashion: ("-x" "-y") is equivalent to ("-xy"). If an option +accepts values, then it must be the last option in the +combination; the value is the next argument. So, for example, using +the following grammar: + ((apples (single-char #\a)) + (blimps (single-char #\b) (value #t)) + (catalexis (single-char #\c) (value #t))) +the following argument lists would be acceptable: + ("-a" "-b" "bang" "-c" "couth") ("bang" and "couth" are the values + for "blimps" and "catalexis") + ("-ab" "bang" "-c" "couth") (same) + ("-ac" "couth" "-b" "bang") (same) + ("-abc" "couth" "bang") (an error, since `-b' is not the + last option in its combination) + +If an option's value is optional, then `getopt-long' decides +whether it has a value by looking at what follows it in ARGS. If +the next element is a string, and it does not appear to be an +option itself, then that string is the option's value. + +The value of a long option can appear as the next element in ARGS, +or it can follow the option name, separated by an `=' character. +Thus, using the same grammar as above, the following argument lists +are equivalent: + ("--apples" "Braeburn" "--blimps" "Goodyear") + ("--apples=Braeburn" "--blimps" "Goodyear") + ("--blimps" "Goodyear" "--apples=Braeburn") + +If the option "--" appears in ARGS, argument parsing stops there; +subsequent arguments are returned as ordinary arguments, even if +they resemble options. So, in the argument list: + ("--apples" "Granny Smith" "--" "--blimp" "Goodyear") +`getopt-long' will recognize the `apples' option as having the +value "Granny Smith", but it will not recognize the `blimp' +option; it will return the strings "--blimp" and "Goodyear" as +ordinary argument strings. + +The `getopt-long' function returns the parsed argument list as an +assocation list, mapping option names --- the symbols from GRAMMAR +--- onto their values, or #t if the option does not accept a value. +Unused options do not appear in the alist. + +All arguments that are not the value of any option are returned +as a list, associated with the empty list. + +`getopt-long' throws an exception if: +- it finds an unrecognized option in ARGS +- a required option is omitted +- an option that requires an argument doesn't get one +- an option that doesn't accept an argument does get one (this can + only happen using the long option `--opt=value' syntax) +- an option predicate fails + +So, for example: + +(define grammar + `((lockfile-dir (required? #t) + (value #t) + (single-char #\k) + (predicate ,file-is-directory?)) + (verbose (required? #f) + (single-char #\v) + (value #f)) + (x-includes (single-char #\x)) + (rnet-server (single-char #\y) + (predicate ,string?)))) + +(getopt-long '("my-prog" "-vk" "/tmp" "foo1" "--x-includes=/usr/include" + "--rnet-server=lamprod" "--" "-fred" "foo2" "foo3") + grammar) +=> ((() "foo1" "-fred" "foo2" "foo3") + (rnet-server . "lamprod") + (x-includes . "/usr/include") + (lockfile-dir . "/tmp") + (verbose . #t)) + +** The (ice-9 getopt-gnu-style) module is obsolete; use (ice-9 getopt-long). + +It will be removed in a few releases. + +** New syntax: lambda* +** New syntax: define* +** New syntax: define*-public +** New syntax: defmacro* +** New syntax: defmacro*-public +Guile now supports optional arguments. + +`lambda*', `define*', `define*-public', `defmacro*' and +`defmacro*-public' are identical to the non-* versions except that +they use an extended type of parameter list that has the following BNF +syntax (parentheses are literal, square brackets indicate grouping, +and `*', `+' and `?' have the usual meaning): + + ext-param-list ::= ( [identifier]* [#&optional [ext-var-decl]+]? + [#&key [ext-var-decl]+ [#&allow-other-keys]?]? + [[#&rest identifier]|[. identifier]]? ) | [identifier] + + ext-var-decl ::= identifier | ( identifier expression ) + +The semantics are best illustrated with the following documentation +and examples for `lambda*': + + lambda* args . body + lambda extended for optional and keyword arguments + + lambda* creates a procedure that takes optional arguments. These + are specified by putting them inside brackets at the end of the + paramater list, but before any dotted rest argument. For example, + (lambda* (a b #&optional c d . e) '()) + creates a procedure with fixed arguments a and b, optional arguments c + and d, and rest argument e. If the optional arguments are omitted + in a call, the variables for them are unbound in the procedure. This + can be checked with the bound? macro. + + lambda* can also take keyword arguments. For example, a procedure + defined like this: + (lambda* (#&key xyzzy larch) '()) + can be called with any of the argument lists (#:xyzzy 11) + (#:larch 13) (#:larch 42 #:xyzzy 19) (). Whichever arguments + are given as keywords are bound to values. + + Optional and keyword arguments can also be given default values + which they take on when they are not present in a call, by giving a + two-item list in place of an optional argument, for example in: + (lambda* (foo #&optional (bar 42) #&key (baz 73)) (list foo bar baz)) + foo is a fixed argument, bar is an optional argument with default + value 42, and baz is a keyword argument with default value 73. + Default value expressions are not evaluated unless they are needed + and until the procedure is called. + + lambda* now supports two more special parameter list keywords. + + lambda*-defined procedures now throw an error by default if a + keyword other than one of those specified is found in the actual + passed arguments. However, specifying #&allow-other-keys + immediately after the kyword argument declarations restores the + previous behavior of ignoring unknown keywords. lambda* also now + guarantees that if the same keyword is passed more than once, the + last one passed is the one that takes effect. For example, + ((lambda* (#&key (heads 0) (tails 0)) (display (list heads tails))) + #:heads 37 #:tails 42 #:heads 99) + would result in (99 47) being displayed. + + #&rest is also now provided as a synonym for the dotted syntax rest + argument. The argument lists (a . b) and (a #&rest b) are equivalent in + all respects to lambda*. This is provided for more similarity to DSSSL, + MIT-Scheme and Kawa among others, as well as for refugees from other + Lisp dialects. + +Further documentation may be found in the optargs.scm file itself. + +The optional argument module also exports the macros `let-optional', +`let-optional*', `let-keywords', `let-keywords*' and `bound?'. These +are not documented here because they may be removed in the future, but +full documentation is still available in optargs.scm. + +** New syntax: and-let* +Guile now supports the `and-let*' form, described in the draft SRFI-2. + +Syntax: (land* ( ...) ...) +Each should have one of the following forms: + ( ) + () + +Each or should be an identifier. Each + should be a valid expression. The should be a +possibly empty sequence of expressions, like the of a +lambda form. + +Semantics: A LAND* expression is evaluated by evaluating the + or of each of the s from +left to right. The value of the first or + that evaluates to a false value is returned; the +remaining s and s are not evaluated. +The forms are evaluated iff all the s and +s evaluate to true values. + +The s and the are evaluated in an environment +binding each of the preceding ( ) +clauses to the value of the . Later bindings +shadow earlier bindings. + +Guile's and-let* macro was contributed by Michael Livshin. + +** New sorting functions + +*** New function: sorted? SEQUENCE LESS? +Returns `#t' when the sequence argument is in non-decreasing order +according to LESS? (that is, there is no adjacent pair `... x y +...' for which `(less? y x)'). + +Returns `#f' when the sequence contains at least one out-of-order +pair. It is an error if the sequence is neither a list nor a +vector. + +*** New function: merge LIST1 LIST2 LESS? +LIST1 and LIST2 are sorted lists. +Returns the sorted list of all elements in LIST1 and LIST2. + +Assume that the elements a and b1 in LIST1 and b2 in LIST2 are "equal" +in the sense that (LESS? x y) --> #f for x, y in {a, b1, b2}, +and that a < b1 in LIST1. Then a < b1 < b2 in the result. +(Here "<" should read "comes before".) + +*** New procedure: merge! LIST1 LIST2 LESS? +Merges two lists, re-using the pairs of LIST1 and LIST2 to build +the result. If the code is compiled, and LESS? constructs no new +pairs, no pairs at all will be allocated. The first pair of the +result will be either the first pair of LIST1 or the first pair of +LIST2. + +*** New function: sort SEQUENCE LESS? +Accepts either a list or a vector, and returns a new sequence +which is sorted. The new sequence is the same type as the input. +Always `(sorted? (sort sequence less?) less?)'. The original +sequence is not altered in any way. The new sequence shares its +elements with the old one; no elements are copied. + +*** New procedure: sort! SEQUENCE LESS +Returns its sorted result in the original boxes. No new storage is +allocated at all. Proper usage: (set! slist (sort! slist <)) + +*** New function: stable-sort SEQUENCE LESS? +Similar to `sort' but stable. That is, if "equal" elements are +ordered a < b in the original sequence, they will have the same order +in the result. + +*** New function: stable-sort! SEQUENCE LESS? +Similar to `sort!' but stable. +Uses temporary storage when sorting vectors. + +*** New functions: sort-list, sort-list! +Added for compatibility with scsh. + +** New built-in random number support + +*** New function: random N [STATE] +Accepts a positive integer or real N and returns a number of the +same type between zero (inclusive) and N (exclusive). The values +returned have a uniform distribution. + +The optional argument STATE must be of the type produced by +`copy-random-state' or `seed->random-state'. It defaults to the value +of the variable `*random-state*'. This object is used to maintain the +state of the pseudo-random-number generator and is altered as a side +effect of the `random' operation. + +*** New variable: *random-state* +Holds a data structure that encodes the internal state of the +random-number generator that `random' uses by default. The nature +of this data structure is implementation-dependent. It may be +printed out and successfully read back in, but may or may not +function correctly as a random-number state object in another +implementation. + +*** New function: copy-random-state [STATE] +Returns a new object of type suitable for use as the value of the +variable `*random-state*' and as a second argument to `random'. +If argument STATE is given, a copy of it is returned. Otherwise a +copy of `*random-state*' is returned. + +*** New function: seed->random-state SEED +Returns a new object of type suitable for use as the value of the +variable `*random-state*' and as a second argument to `random'. +SEED is a string or a number. A new state is generated and +initialized using SEED. + +*** New function: random:uniform [STATE] +Returns an uniformly distributed inexact real random number in the +range between 0 and 1. + +*** New procedure: random:solid-sphere! VECT [STATE] +Fills VECT with inexact real random numbers the sum of whose +squares is less than 1.0. Thinking of VECT as coordinates in +space of dimension N = `(vector-length VECT)', the coordinates are +uniformly distributed within the unit N-shere. The sum of the +squares of the numbers is returned. VECT can be either a vector +or a uniform vector of doubles. + +*** New procedure: random:hollow-sphere! VECT [STATE] +Fills VECT with inexact real random numbers the sum of whose squares +is equal to 1.0. Thinking of VECT as coordinates in space of +dimension n = `(vector-length VECT)', the coordinates are uniformly +distributed over the surface of the unit n-shere. VECT can be either +a vector or a uniform vector of doubles. + +*** New function: random:normal [STATE] +Returns an inexact real in a normal distribution with mean 0 and +standard deviation 1. For a normal distribution with mean M and +standard deviation D use `(+ M (* D (random:normal)))'. + +*** New procedure: random:normal-vector! VECT [STATE] +Fills VECT with inexact real random numbers which are independent and +standard normally distributed (i.e., with mean 0 and variance 1). +VECT can be either a vector or a uniform vector of doubles. + +*** New function: random:exp STATE +Returns an inexact real in an exponential distribution with mean 1. +For an exponential distribution with mean U use (* U (random:exp)). + +** The range of logand, logior, logxor, logtest, and logbit? have changed. + +These functions now operate on numbers in the range of a C unsigned +long. + +These functions used to operate on numbers in the range of a C signed +long; however, this seems inappropriate, because Guile integers don't +overflow. + +** New function: make-guardian +This is an implementation of guardians as described in +R. Kent Dybvig, Carl Bruggeman, and David Eby (1993) "Guardians in a +Generation-Based Garbage Collector" ACM SIGPLAN Conference on +Programming Language Design and Implementation, June 1993 +ftp://ftp.cs.indiana.edu/pub/scheme-repository/doc/pubs/guardians.ps.gz + +** New functions: delq1!, delv1!, delete1! +These procedures behave similar to delq! and friends but delete only +one object if at all. + +** New function: unread-string STRING PORT +Unread STRING to PORT, that is, push it back onto the port so that +next read operation will work on the pushed back characters. + +** unread-char can now be called multiple times +If unread-char is called multiple times, the unread characters will be +read again in last-in first-out order. + +** the procedures uniform-array-read! and uniform-array-write! now +work on any kind of port, not just ports which are open on a file. + +** Now 'l' in a port mode requests line buffering. + +** The procedure truncate-file now works on string ports as well +as file ports. If the size argument is omitted, the current +file position is used. + +** new procedure: seek PORT/FDES OFFSET WHENCE +The arguments are the same as for the old fseek procedure, but it +works on string ports as well as random-access file ports. + +** the fseek procedure now works on string ports, since it has been +redefined using seek. + +** the setvbuf procedure now uses a default size if mode is _IOFBF and +size is not supplied. + +** the newline procedure no longer flushes the port if it's not +line-buffered: previously it did if it was the current output port. + +** open-pipe and close-pipe are no longer primitive procedures, but +an emulation can be obtained using `(use-modules (ice-9 popen))'. + +** the freopen procedure has been removed. + +** new procedure: drain-input PORT +Drains PORT's read buffers (including any pushed-back characters) +and returns the contents as a single string. + +** New function: map-in-order PROC LIST1 LIST2 ... +Version of `map' which guarantees that the procedure is applied to the +lists in serial order. + +** Renamed `serial-array-copy!' and `serial-array-map!' to +`array-copy-in-order!' and `array-map-in-order!'. The old names are +now obsolete and will go away in release 1.5. + +** New syntax: collect BODY1 ... +Version of `begin' which returns a list of the results of the body +forms instead of the result of the last body form. In contrast to +`begin', `collect' allows an empty body. + +** New functions: read-history FILENAME, write-history FILENAME +Read/write command line history from/to file. Returns #t on success +and #f if an error occured. + +** `ls' and `lls' in module (ice-9 ls) now handle no arguments. + +These procedures return a list of definitions available in the specified +argument, a relative module reference. In the case of no argument, +`(current-module)' is now consulted for definitions to return, instead +of simply returning #f, the former behavior. + +** The #/ syntax for lists is no longer supported. + +Earlier versions of Scheme accepted this syntax, but printed a +warning. + +** Guile no longer consults the SCHEME_LOAD_PATH environment variable. + +Instead, you should set GUILE_LOAD_PATH to tell Guile where to find +modules. + +* Changes to the gh_ interface + +** gh_scm2doubles + +Now takes a second argument which is the result array. If this +pointer is NULL, a new array is malloced (the old behaviour). + +** gh_chars2byvect, gh_shorts2svect, gh_floats2fvect, gh_scm2chars, + gh_scm2shorts, gh_scm2longs, gh_scm2floats + +New functions. + +* Changes to the scm_ interface + +** Function: scm_make_named_hook (char* name, int n_args) + +Creates a hook in the same way as make-hook above but also +binds a variable named NAME to it. + +This is the typical way of creating a hook from C code. + +Currently, the variable is created in the "current" module. This +might change when we get the new module system. + +** The smob interface + +The interface for creating smobs has changed. For documentation, see +data-rep.info (made from guile-core/doc/data-rep.texi). + +*** Deprecated function: SCM scm_newsmob (scm_smobfuns *) + +>>> This function will be removed in 1.3.4. <<< + +It is replaced by: + +*** Function: SCM scm_make_smob_type (const char *name, scm_sizet size) +This function adds a new smob type, named NAME, with instance size +SIZE to the system. The return value is a tag that is used in +creating instances of the type. If SIZE is 0, then no memory will +be allocated when instances of the smob are created, and nothing +will be freed by the default free function. + +*** Function: void scm_set_smob_mark (long tc, SCM (*mark) (SCM)) +This function sets the smob marking procedure for the smob type +specified by the tag TC. TC is the tag returned by +`scm_make_smob_type'. + +*** Function: void scm_set_smob_free (long tc, SCM (*mark) (SCM)) +This function sets the smob freeing procedure for the smob type +specified by the tag TC. TC is the tag returned by +`scm_make_smob_type'. + +*** Function: void scm_set_smob_print (tc, print) + + - Function: void scm_set_smob_print (long tc, + scm_sizet (*print) (SCM, + SCM, + scm_print_state *)) + +This function sets the smob printing procedure for the smob type +specified by the tag TC. TC is the tag returned by +`scm_make_smob_type'. + +*** Function: void scm_set_smob_equalp (long tc, SCM (*equalp) (SCM, SCM)) +This function sets the smob equality-testing predicate for the +smob type specified by the tag TC. TC is the tag returned by +`scm_make_smob_type'. + +*** Macro: void SCM_NEWSMOB (SCM var, long tc, void *data) +Make VALUE contain a smob instance of the type with type code TC and +smob data DATA. VALUE must be previously declared as C type `SCM'. + +*** Macro: fn_returns SCM_RETURN_NEWSMOB (long tc, void *data) +This macro expands to a block of code that creates a smob instance +of the type with type code TC and smob data DATA, and returns that +`SCM' value. It should be the last piece of code in a block. + +** The interfaces for using I/O ports and implementing port types +(ptobs) have changed significantly. The new interface is based on +shared access to buffers and a new set of ptob procedures. + +*** scm_newptob has been removed + +It is replaced by: + +*** Function: SCM scm_make_port_type (type_name, fill_buffer, write_flush) + +- Function: SCM scm_make_port_type (char *type_name, + int (*fill_buffer) (SCM port), + void (*write_flush) (SCM port)); + +Similarly to the new smob interface, there is a set of function +setters by which the user can customize the behaviour of his port +type. See ports.h (scm_set_port_XXX). + +** scm_strport_to_string: New function: creates a new string from +a string port's buffer. + +** Plug in interface for random number generators +The variable `scm_the_rng' in random.c contains a value and three +function pointers which together define the current random number +generator being used by the Scheme level interface and the random +number library functions. + +The user is free to replace the default generator with the generator +of his own choice. + +*** Variable: size_t scm_the_rng.rstate_size +The size of the random state type used by the current RNG +measured in chars. + +*** Function: unsigned long scm_the_rng.random_bits (scm_rstate *STATE) +Given the random STATE, return 32 random bits. + +*** Function: void scm_the_rng.init_rstate (scm_rstate *STATE, chars *S, int N) +Seed random state STATE using string S of length N. + +*** Function: scm_rstate *scm_the_rng.copy_rstate (scm_rstate *STATE) +Given random state STATE, return a malloced copy. + +** Default RNG +The default RNG is the MWC (Multiply With Carry) random number +generator described by George Marsaglia at the Department of +Statistics and Supercomputer Computations Research Institute, The +Florida State University (http://stat.fsu.edu/~geo). + +It uses 64 bits, has a period of 4578426017172946943 (4.6e18), and +passes all tests in the DIEHARD test suite +(http://stat.fsu.edu/~geo/diehard.html). The generation of 32 bits +costs one multiply and one add on platforms which either supports long +longs (gcc does this on most systems) or have 64 bit longs. The cost +is four multiply on other systems but this can be optimized by writing +scm_i_uniform32 in assembler. + +These functions are provided through the scm_the_rng interface for use +by libguile and the application. + +*** Function: unsigned long scm_i_uniform32 (scm_i_rstate *STATE) +Given the random STATE, return 32 random bits. +Don't use this function directly. Instead go through the plugin +interface (see "Plug in interface" above). + +*** Function: void scm_i_init_rstate (scm_i_rstate *STATE, char *SEED, int N) +Initialize STATE using SEED of length N. + +*** Function: scm_i_rstate *scm_i_copy_rstate (scm_i_rstate *STATE) +Return a malloc:ed copy of STATE. This function can easily be re-used +in the interfaces to other RNGs. + +** Random number library functions +These functions use the current RNG through the scm_the_rng interface. +It might be a good idea to use these functions from your C code so +that only one random generator is used by all code in your program. + +The default random state is stored in: + +*** Variable: SCM scm_var_random_state +Contains the vcell of the Scheme variable "*random-state*" which is +used as default state by all random number functions in the Scheme +level interface. + +Example: + + double x = scm_c_uniform01 (SCM_RSTATE (SCM_CDR (scm_var_random_state))); + +*** Function: scm_rstate *scm_c_default_rstate (void) +This is a convenience function which returns the value of +scm_var_random_state. An error message is generated if this value +isn't a random state. + +*** Function: scm_rstate *scm_c_make_rstate (char *SEED, int LENGTH) +Make a new random state from the string SEED of length LENGTH. + +It is generally not a good idea to use multiple random states in a +program. While subsequent random numbers generated from one random +state are guaranteed to be reasonably independent, there is no such +guarantee for numbers generated from different random states. + +*** Macro: unsigned long scm_c_uniform32 (scm_rstate *STATE) +Return 32 random bits. + +*** Function: double scm_c_uniform01 (scm_rstate *STATE) +Return a sample from the uniform(0,1) distribution. + +*** Function: double scm_c_normal01 (scm_rstate *STATE) +Return a sample from the normal(0,1) distribution. + +*** Function: double scm_c_exp1 (scm_rstate *STATE) +Return a sample from the exp(1) distribution. + +*** Function: unsigned long scm_c_random (scm_rstate *STATE, unsigned long M) +Return a sample from the discrete uniform(0,M) distribution. + +*** Function: SCM scm_c_random_bignum (scm_rstate *STATE, SCM M) +Return a sample from the discrete uniform(0,M) distribution. +M must be a bignum object. The returned value may be an INUM. + + + +Changes in Guile 1.3 (released Monday, October 19, 1998): + +* Changes to the distribution + +** We renamed the SCHEME_LOAD_PATH environment variable to GUILE_LOAD_PATH. +To avoid conflicts, programs should name environment variables after +themselves, except when there's a common practice establishing some +other convention. + +For now, Guile supports both GUILE_LOAD_PATH and SCHEME_LOAD_PATH, +giving the former precedence, and printing a warning message if the +latter is set. Guile 1.4 will not recognize SCHEME_LOAD_PATH at all. + +** The header files related to multi-byte characters have been removed. +They were: libguile/extchrs.h and libguile/mbstrings.h. Any C code +which referred to these explicitly will probably need to be rewritten, +since the support for the variant string types has been removed; see +below. + +** The header files append.h and sequences.h have been removed. These +files implemented non-R4RS operations which would encourage +non-portable programming style and less easy-to-read code. + +* Changes to the stand-alone interpreter + +** New procedures have been added to implement a "batch mode": + +*** Function: batch-mode? + + Returns a boolean indicating whether the interpreter is in batch + mode. + +*** Function: set-batch-mode?! ARG + + If ARG is true, switches the interpreter to batch mode. The `#f' + case has not been implemented. + +** Guile now provides full command-line editing, when run interactively. +To use this feature, you must have the readline library installed. +The Guile build process will notice it, and automatically include +support for it. + +The readline library is available via anonymous FTP from any GNU +mirror site; the canonical location is "ftp://prep.ai.mit.edu/pub/gnu". + +** the-last-stack is now a fluid. + +* Changes to the procedure for linking libguile with your programs + +** You can now use the `guile-config' utility to build programs that use Guile. + +Guile now includes a command-line utility called `guile-config', which +can provide information about how to compile and link programs that +use Guile. + +*** `guile-config compile' prints any C compiler flags needed to use Guile. +You should include this command's output on the command line you use +to compile C or C++ code that #includes the Guile header files. It's +usually just a `-I' flag to help the compiler find the Guile headers. + + +*** `guile-config link' prints any linker flags necessary to link with Guile. + +This command writes to its standard output a list of flags which you +must pass to the linker to link your code against the Guile library. +The flags include '-lguile' itself, any other libraries the Guile +library depends upon, and any `-L' flags needed to help the linker +find those libraries. + +For example, here is a Makefile rule that builds a program named 'foo' +from the object files ${FOO_OBJECTS}, and links them against Guile: + + foo: ${FOO_OBJECTS} + ${CC} ${CFLAGS} ${FOO_OBJECTS} `guile-config link` -o foo + +Previous Guile releases recommended that you use autoconf to detect +which of a predefined set of libraries were present on your system. +It is more robust to use `guile-config', since it records exactly which +libraries the installed Guile library requires. + +This was originally called `build-guile', but was renamed to +`guile-config' before Guile 1.3 was released, to be consistent with +the analogous script for the GTK+ GUI toolkit, which is called +`gtk-config'. + + +** Use the GUILE_FLAGS macro in your configure.in file to find Guile. + +If you are using the GNU autoconf package to configure your program, +you can use the GUILE_FLAGS autoconf macro to call `guile-config' +(described above) and gather the necessary values for use in your +Makefiles. + +The GUILE_FLAGS macro expands to configure script code which runs the +`guile-config' script, to find out where Guile's header files and +libraries are installed. It sets two variables, marked for +substitution, as by AC_SUBST. + + GUILE_CFLAGS --- flags to pass to a C or C++ compiler to build + code that uses Guile header files. This is almost always just a + -I flag. + + GUILE_LDFLAGS --- flags to pass to the linker to link a + program against Guile. This includes `-lguile' for the Guile + library itself, any libraries that Guile itself requires (like + -lqthreads), and so on. It may also include a -L flag to tell the + compiler where to find the libraries. + +GUILE_FLAGS is defined in the file guile.m4, in the top-level +directory of the Guile distribution. You can copy it into your +package's aclocal.m4 file, and then use it in your configure.in file. + +If you are using the `aclocal' program, distributed with GNU automake, +to maintain your aclocal.m4 file, the Guile installation process +installs guile.m4 where aclocal will find it. All you need to do is +use GUILE_FLAGS in your configure.in file, and then run `aclocal'; +this will copy the definition of GUILE_FLAGS into your aclocal.m4 +file. + + +* Changes to Scheme functions and syntax + +** Multi-byte strings have been removed, as have multi-byte and wide +ports. We felt that these were the wrong approach to +internationalization support. + +** New function: readline [PROMPT] +Read a line from the terminal, and allow the user to edit it, +prompting with PROMPT. READLINE provides a large set of Emacs-like +editing commands, lets the user recall previously typed lines, and +works on almost every kind of terminal, including dumb terminals. + +READLINE assumes that the cursor is at the beginning of the line when +it is invoked. Thus, you can't print a prompt yourself, and then call +READLINE; you need to package up your prompt as a string, pass it to +the function, and let READLINE print the prompt itself. This is +because READLINE needs to know the prompt's screen width. + +For Guile to provide this function, you must have the readline +library, version 2.1 or later, installed on your system. Readline is +available via anonymous FTP from prep.ai.mit.edu in pub/gnu, or from +any GNU mirror site. + +See also ADD-HISTORY function. + +** New function: add-history STRING +Add STRING as the most recent line in the history used by the READLINE +command. READLINE does not add lines to the history itself; you must +call ADD-HISTORY to make previous input available to the user. + +** The behavior of the read-line function has changed. + +This function now uses standard C library functions to read the line, +for speed. This means that it doesn not respect the value of +scm-line-incrementors; it assumes that lines are delimited with +#\newline. + +(Note that this is read-line, the function that reads a line of text +from a port, not readline, the function that reads a line from a +terminal, providing full editing capabilities.) + +** New module (ice-9 getopt-gnu-style): Parse command-line arguments. + +This module provides some simple argument parsing. It exports one +function: + +Function: getopt-gnu-style ARG-LS + Parse a list of program arguments into an alist of option + descriptions. + + Each item in the list of program arguments is examined to see if + it meets the syntax of a GNU long-named option. An argument like + `--MUMBLE' produces an element of the form (MUMBLE . #t) in the + returned alist, where MUMBLE is a keyword object with the same + name as the argument. An argument like `--MUMBLE=FROB' produces + an element of the form (MUMBLE . FROB), where FROB is a string. + + As a special case, the returned alist also contains a pair whose + car is the symbol `rest'. The cdr of this pair is a list + containing all the items in the argument list that are not options + of the form mentioned above. + + The argument `--' is treated specially: all items in the argument + list appearing after such an argument are not examined, and are + returned in the special `rest' list. + + This function does not parse normal single-character switches. + You will need to parse them out of the `rest' list yourself. + +** The read syntax for byte vectors and short vectors has changed. + +Instead of #bytes(...), write #y(...). + +Instead of #short(...), write #h(...). + +This may seem nutty, but, like the other uniform vectors, byte vectors +and short vectors want to have the same print and read syntax (and, +more basic, want to have read syntax!). Changing the read syntax to +use multiple characters after the hash sign breaks with the +conventions used in R5RS and the conventions used for the other +uniform vectors. It also introduces complexity in the current reader, +both on the C and Scheme levels. (The Right solution is probably to +change the syntax and prototypes for uniform vectors entirely.) + + +** The new module (ice-9 session) provides useful interactive functions. + +*** New procedure: (apropos REGEXP OPTION ...) + +Display a list of top-level variables whose names match REGEXP, and +the modules they are imported from. Each OPTION should be one of the +following symbols: + + value --- Show the value of each matching variable. + shadow --- Show bindings shadowed by subsequently imported modules. + full --- Same as both `shadow' and `value'. + +For example: + + guile> (apropos "trace" 'full) + debug: trace # + debug: untrace # + the-scm-module: display-backtrace #> + the-scm-module: before-backtrace-hook () + the-scm-module: backtrace # + the-scm-module: after-backtrace-hook () + the-scm-module: has-shown-backtrace-hint? #f + guile> + +** There are new functions and syntax for working with macros. + +Guile implements macros as a special object type. Any variable whose +top-level binding is a macro object acts as a macro. The macro object +specifies how the expression should be transformed before evaluation. + +*** Macro objects now print in a reasonable way, resembling procedures. + +*** New function: (macro? OBJ) +True iff OBJ is a macro object. + +*** New function: (primitive-macro? OBJ) +Like (macro? OBJ), but true only if OBJ is one of the Guile primitive +macro transformers, implemented in eval.c rather than Scheme code. + +Why do we have this function? +- For symmetry with procedure? and primitive-procedure?, +- to allow custom print procedures to tell whether a macro is + primitive, and display it differently, and +- to allow compilers and user-written evaluators to distinguish + builtin special forms from user-defined ones, which could be + compiled. + +*** New function: (macro-type OBJ) +Return a value indicating what kind of macro OBJ is. Possible return +values are: + + The symbol `syntax' --- a macro created by procedure->syntax. + The symbol `macro' --- a macro created by procedure->macro. + The symbol `macro!' --- a macro created by procedure->memoizing-macro. + The boolean #f --- if OBJ is not a macro object. + +*** New function: (macro-name MACRO) +Return the name of the macro object MACRO's procedure, as returned by +procedure-name. + +*** New function: (macro-transformer MACRO) +Return the transformer procedure for MACRO. + +*** New syntax: (use-syntax MODULE ... TRANSFORMER) + +Specify a new macro expander to use in the current module. Each +MODULE is a module name, with the same meaning as in the `use-modules' +form; each named module's exported bindings are added to the current +top-level environment. TRANSFORMER is an expression evaluated in the +resulting environment which must yield a procedure to use as the +module's eval transformer: every expression evaluated in this module +is passed to this function, and the result passed to the Guile +interpreter. + +*** macro-eval! is removed. Use local-eval instead. + +** Some magic has been added to the printer to better handle user +written printing routines (like record printers, closure printers). + +The problem is that these user written routines must have access to +the current `print-state' to be able to handle fancy things like +detection of circular references. These print-states have to be +passed to the builtin printing routines (display, write, etc) to +properly continue the print chain. + +We didn't want to change all existing print code so that it +explicitly passes thru a print state in addition to a port. Instead, +we extented the possible values that the builtin printing routines +accept as a `port'. In addition to a normal port, they now also take +a pair of a normal port and a print-state. Printing will go to the +port and the print-state will be used to control the detection of +circular references, etc. If the builtin function does not care for a +print-state, it is simply ignored. + +User written callbacks are now called with such a pair as their +`port', but because every function now accepts this pair as a PORT +argument, you don't have to worry about that. In fact, it is probably +safest to not check for these pairs. + +However, it is sometimes necessary to continue a print chain on a +different port, for example to get a intermediate string +representation of the printed value, mangle that string somehow, and +then to finally print the mangled string. Use the new function + + inherit-print-state OLD-PORT NEW-PORT + +for this. It constructs a new `port' that prints to NEW-PORT but +inherits the print-state of OLD-PORT. + +** struct-vtable-offset renamed to vtable-offset-user + +** New constants: vtable-index-layout, vtable-index-vtable, vtable-index-printer + +** There is now a third optional argument to make-vtable-vtable + (and fourth to make-struct) when constructing new types (vtables). + This argument initializes field vtable-index-printer of the vtable. + +** The detection of circular references has been extended to structs. +That is, a structure that -- in the process of being printed -- prints +itself does not lead to infinite recursion. + +** There is now some basic support for fluids. Please read +"libguile/fluid.h" to find out more. It is accessible from Scheme with +the following functions and macros: + +Function: make-fluid + + Create a new fluid object. Fluids are not special variables or + some other extension to the semantics of Scheme, but rather + ordinary Scheme objects. You can store them into variables (that + are still lexically scoped, of course) or into any other place you + like. Every fluid has a initial value of `#f'. + +Function: fluid? OBJ + + Test whether OBJ is a fluid. + +Function: fluid-ref FLUID +Function: fluid-set! FLUID VAL + + Access/modify the fluid FLUID. Modifications are only visible + within the current dynamic root (that includes threads). + +Function: with-fluids* FLUIDS VALUES THUNK + + FLUIDS is a list of fluids and VALUES a corresponding list of + values for these fluids. Before THUNK gets called the values are + installed in the fluids and the old values of the fluids are + saved in the VALUES list. When the flow of control leaves THUNK + or reenters it, the values get swapped again. You might think of + this as a `safe-fluid-excursion'. Note that the VALUES list is + modified by `with-fluids*'. + +Macro: with-fluids ((FLUID VALUE) ...) FORM ... + + The same as `with-fluids*' but with a different syntax. It looks + just like `let', but both FLUID and VALUE are evaluated. Remember, + fluids are not special variables but ordinary objects. FLUID + should evaluate to a fluid. + +** Changes to system call interfaces: + +*** close-port, close-input-port and close-output-port now return a +boolean instead of an `unspecified' object. #t means that the port +was successfully closed, while #f means it was already closed. It is +also now possible for these procedures to raise an exception if an +error occurs (some errors from write can be delayed until close.) + +*** the first argument to chmod, fcntl, ftell and fseek can now be a +file descriptor. + +*** the third argument to fcntl is now optional. + +*** the first argument to chown can now be a file descriptor or a port. + +*** the argument to stat can now be a port. + +*** The following new procedures have been added (most use scsh +interfaces): + +*** procedure: close PORT/FD + Similar to close-port (*note close-port: Closing Ports.), but also + works on file descriptors. A side effect of closing a file + descriptor is that any ports using that file descriptor are moved + to a different file descriptor and have their revealed counts set + to zero. + +*** procedure: port->fdes PORT + Returns the integer file descriptor underlying PORT. As a side + effect the revealed count of PORT is incremented. + +*** procedure: fdes->ports FDES + Returns a list of existing ports which have FDES as an underlying + file descriptor, without changing their revealed counts. + +*** procedure: fdes->inport FDES + Returns an existing input port which has FDES as its underlying + file descriptor, if one exists, and increments its revealed count. + Otherwise, returns a new input port with a revealed count of 1. + +*** procedure: fdes->outport FDES + Returns an existing output port which has FDES as its underlying + file descriptor, if one exists, and increments its revealed count. + Otherwise, returns a new output port with a revealed count of 1. + + The next group of procedures perform a `dup2' system call, if NEWFD +(an integer) is supplied, otherwise a `dup'. The file descriptor to be +duplicated can be supplied as an integer or contained in a port. The +type of value returned varies depending on which procedure is used. + + All procedures also have the side effect when performing `dup2' that +any ports using NEWFD are moved to a different file descriptor and have +their revealed counts set to zero. + +*** procedure: dup->fdes PORT/FD [NEWFD] + Returns an integer file descriptor. + +*** procedure: dup->inport PORT/FD [NEWFD] + Returns a new input port using the new file descriptor. + +*** procedure: dup->outport PORT/FD [NEWFD] + Returns a new output port using the new file descriptor. + +*** procedure: dup PORT/FD [NEWFD] + Returns a new port if PORT/FD is a port, with the same mode as the + supplied port, otherwise returns an integer file descriptor. + +*** procedure: dup->port PORT/FD MODE [NEWFD] + Returns a new port using the new file descriptor. MODE supplies a + mode string for the port (*note open-file: File Ports.). + +*** procedure: setenv NAME VALUE + Modifies the environment of the current process, which is also the + default environment inherited by child processes. + + If VALUE is `#f', then NAME is removed from the environment. + Otherwise, the string NAME=VALUE is added to the environment, + replacing any existing string with name matching NAME. + + The return value is unspecified. + +*** procedure: truncate-file OBJ SIZE + Truncates the file referred to by OBJ to at most SIZE bytes. OBJ + can be a string containing a file name or an integer file + descriptor or port open for output on the file. The underlying + system calls are `truncate' and `ftruncate'. + + The return value is unspecified. + +*** procedure: setvbuf PORT MODE [SIZE] + Set the buffering mode for PORT. MODE can be: + `_IONBF' + non-buffered + + `_IOLBF' + line buffered + + `_IOFBF' + block buffered, using a newly allocated buffer of SIZE bytes. + However if SIZE is zero or unspecified, the port will be made + non-buffered. + + This procedure should not be used after I/O has been performed with + the port. + + Ports are usually block buffered by default, with a default buffer + size. Procedures e.g., *Note open-file: File Ports, which accept a + mode string allow `0' to be added to request an unbuffered port. + +*** procedure: fsync PORT/FD + Copies any unwritten data for the specified output file descriptor + to disk. If PORT/FD is a port, its buffer is flushed before the + underlying file descriptor is fsync'd. The return value is + unspecified. + +*** procedure: open-fdes PATH FLAGS [MODES] + Similar to `open' but returns a file descriptor instead of a port. + +*** procedure: execle PATH ENV [ARG] ... + Similar to `execl', but the environment of the new process is + specified by ENV, which must be a list of strings as returned by + the `environ' procedure. + + This procedure is currently implemented using the `execve' system + call, but we call it `execle' because of its Scheme calling + interface. + +*** procedure: strerror ERRNO + Returns the Unix error message corresponding to ERRNO, an integer. + +*** procedure: primitive-exit [STATUS] + Terminate the current process without unwinding the Scheme stack. + This is would typically be useful after a fork. The exit status + is STATUS if supplied, otherwise zero. + +*** procedure: times + Returns an object with information about real and processor time. + The following procedures accept such an object as an argument and + return a selected component: + + `tms:clock' + The current real time, expressed as time units relative to an + arbitrary base. + + `tms:utime' + The CPU time units used by the calling process. + + `tms:stime' + The CPU time units used by the system on behalf of the + calling process. + + `tms:cutime' + The CPU time units used by terminated child processes of the + calling process, whose status has been collected (e.g., using + `waitpid'). + + `tms:cstime' + Similarly, the CPU times units used by the system on behalf of + terminated child processes. + +** Removed: list-length +** Removed: list-append, list-append! +** Removed: list-reverse, list-reverse! + +** array-map renamed to array-map! + +** serial-array-map renamed to serial-array-map! + +** catch doesn't take #f as first argument any longer + +Previously, it was possible to pass #f instead of a key to `catch'. +That would cause `catch' to pass a jump buffer object to the procedure +passed as second argument. The procedure could then use this jump +buffer objekt as an argument to throw. + +This mechanism has been removed since its utility doesn't motivate the +extra complexity it introduces. + +** The `#/' notation for lists now provokes a warning message from Guile. +This syntax will be removed from Guile in the near future. + +To disable the warning message, set the GUILE_HUSH environment +variable to any non-empty value. + +** The newline character now prints as `#\newline', following the +normal Scheme notation, not `#\nl'. + +* Changes to the gh_ interface + +** The gh_enter function now takes care of loading the Guile startup files. +gh_enter works by calling scm_boot_guile; see the remarks below. + +** Function: void gh_write (SCM x) + +Write the printed representation of the scheme object x to the current +output port. Corresponds to the scheme level `write'. + +** gh_list_length renamed to gh_length. + +** vector handling routines + +Several major changes. In particular, gh_vector() now resembles +(vector ...) (with a caveat -- see manual), and gh_make_vector() now +exists and behaves like (make-vector ...). gh_vset() and gh_vref() +have been renamed gh_vector_set_x() and gh_vector_ref(). Some missing +vector-related gh_ functions have been implemented. + +** pair and list routines + +Implemented several of the R4RS pair and list functions that were +missing. + +** gh_scm2doubles, gh_doubles2scm, gh_doubles2dvect + +New function. Converts double arrays back and forth between Scheme +and C. + +* Changes to the scm_ interface + +** The function scm_boot_guile now takes care of loading the startup files. + +Guile's primary initialization function, scm_boot_guile, now takes +care of loading `boot-9.scm', in the `ice-9' module, to initialize +Guile, define the module system, and put together some standard +bindings. It also loads `init.scm', which is intended to hold +site-specific initialization code. + +Since Guile cannot operate properly until boot-9.scm is loaded, there +is no reason to separate loading boot-9.scm from Guile's other +initialization processes. + +This job used to be done by scm_compile_shell_switches, which didn't +make much sense; in particular, it meant that people using Guile for +non-shell-like applications had to jump through hoops to get Guile +initialized properly. + +** The function scm_compile_shell_switches no longer loads the startup files. +Now, Guile always loads the startup files, whenever it is initialized; +see the notes above for scm_boot_guile and scm_load_startup_files. + +** Function: scm_load_startup_files +This new function takes care of loading Guile's initialization file +(`boot-9.scm'), and the site initialization file, `init.scm'. Since +this is always called by the Guile initialization process, it's +probably not too useful to call this yourself, but it's there anyway. + +** The semantics of smob marking have changed slightly. + +The smob marking function (the `mark' member of the scm_smobfuns +structure) is no longer responsible for setting the mark bit on the +smob. The generic smob handling code in the garbage collector will +set this bit. The mark function need only ensure that any other +objects the smob refers to get marked. + +Note that this change means that the smob's GC8MARK bit is typically +already set upon entry to the mark function. Thus, marking functions +which look like this: + + { + if (SCM_GC8MARKP (ptr)) + return SCM_BOOL_F; + SCM_SETGC8MARK (ptr); + ... mark objects to which the smob refers ... + } + +are now incorrect, since they will return early, and fail to mark any +other objects the smob refers to. Some code in the Guile library used +to work this way. + +** The semantics of the I/O port functions in scm_ptobfuns have changed. + +If you have implemented your own I/O port type, by writing the +functions required by the scm_ptobfuns and then calling scm_newptob, +you will need to change your functions slightly. + +The functions in a scm_ptobfuns structure now expect the port itself +as their argument; they used to expect the `stream' member of the +port's scm_port_table structure. This allows functions in an +scm_ptobfuns structure to easily access the port's cell (and any flags +it its CAR), and the port's scm_port_table structure. + +Guile now passes the I/O port itself as the `port' argument in the +following scm_ptobfuns functions: + + int (*free) (SCM port); + int (*fputc) (int, SCM port); + int (*fputs) (char *, SCM port); + scm_sizet (*fwrite) SCM_P ((char *ptr, + scm_sizet size, + scm_sizet nitems, + SCM port)); + int (*fflush) (SCM port); + int (*fgetc) (SCM port); + int (*fclose) (SCM port); + +The interfaces to the `mark', `print', `equalp', and `fgets' methods +are unchanged. + +If you have existing code which defines its own port types, it is easy +to convert your code to the new interface; simply apply SCM_STREAM to +the port argument to yield the value you code used to expect. + +Note that since both the port and the stream have the same type in the +C code --- they are both SCM values --- the C compiler will not remind +you if you forget to update your scm_ptobfuns functions. + + +** Function: int scm_internal_select (int fds, + SELECT_TYPE *rfds, + SELECT_TYPE *wfds, + SELECT_TYPE *efds, + struct timeval *timeout); + +This is a replacement for the `select' function provided by the OS. +It enables I/O blocking and sleeping to happen for one cooperative +thread without blocking other threads. It also avoids busy-loops in +these situations. It is intended that all I/O blocking and sleeping +will finally go through this function. Currently, this function is +only available on systems providing `gettimeofday' and `select'. + +** Function: SCM scm_internal_stack_catch (SCM tag, + scm_catch_body_t body, + void *body_data, + scm_catch_handler_t handler, + void *handler_data) + +A new sibling to the other two C level `catch' functions +scm_internal_catch and scm_internal_lazy_catch. Use it if you want +the stack to be saved automatically into the variable `the-last-stack' +(scm_the_last_stack_var) on error. This is necessary if you want to +use advanced error reporting, such as calling scm_display_error and +scm_display_backtrace. (They both take a stack object as argument.) + +** Function: SCM scm_spawn_thread (scm_catch_body_t body, + void *body_data, + scm_catch_handler_t handler, + void *handler_data) + +Spawns a new thread. It does a job similar to +scm_call_with_new_thread but takes arguments more suitable when +spawning threads from application C code. + +** The hook scm_error_callback has been removed. It was originally +intended as a way for the user to install his own error handler. But +that method works badly since it intervenes between throw and catch, +thereby changing the semantics of expressions like (catch #t ...). +The correct way to do it is to use one of the C level catch functions +in throw.c: scm_internal_catch/lazy_catch/stack_catch. + +** Removed functions: + +scm_obj_length, scm_list_length, scm_list_append, scm_list_append_x, +scm_list_reverse, scm_list_reverse_x + +** New macros: SCM_LISTn where n is one of the integers 0-9. + +These can be used for pretty list creation from C. The idea is taken +from Erick Gallesio's STk. + +** scm_array_map renamed to scm_array_map_x + +** mbstrings are now removed + +This means that the type codes scm_tc7_mb_string and +scm_tc7_mb_substring has been removed. + +** scm_gen_putc, scm_gen_puts, scm_gen_write, and scm_gen_getc have changed. + +Since we no longer support multi-byte strings, these I/O functions +have been simplified, and renamed. Here are their old names, and +their new names and arguments: + +scm_gen_putc -> void scm_putc (int c, SCM port); +scm_gen_puts -> void scm_puts (char *s, SCM port); +scm_gen_write -> void scm_lfwrite (char *ptr, scm_sizet size, SCM port); +scm_gen_getc -> void scm_getc (SCM port); + + +** The macros SCM_TYP7D and SCM_TYP7SD has been removed. + +** The macro SCM_TYP7S has taken the role of the old SCM_TYP7D + +SCM_TYP7S now masks away the bit which distinguishes substrings from +strings. + +** scm_catch_body_t: Backward incompatible change! + +Body functions to scm_internal_catch and friends do not any longer +take a second argument. This is because it is no longer possible to +pass a #f arg to catch. + +** Calls to scm_protect_object and scm_unprotect now nest properly. + +The function scm_protect_object protects its argument from being freed +by the garbage collector. scm_unprotect_object removes that +protection. + +These functions now nest properly. That is, for every object O, there +is a counter which scm_protect_object(O) increments and +scm_unprotect_object(O) decrements, if the counter is greater than +zero. Every object's counter is zero when it is first created. If an +object's counter is greater than zero, the garbage collector will not +reclaim its storage. + +This allows you to use scm_protect_object in your code without +worrying that some other function you call will call +scm_unprotect_object, and allow it to be freed. Assuming that the +functions you call are well-behaved, and unprotect only those objects +they protect, you can follow the same rule and have confidence that +objects will be freed only at appropriate times. + + +Changes in Guile 1.2 (released Tuesday, June 24 1997): + +* Changes to the distribution + +** Nightly snapshots are now available from ftp.red-bean.com. +The old server, ftp.cyclic.com, has been relinquished to its rightful +owner. + +Nightly snapshots of the Guile development sources are now available via +anonymous FTP from ftp.red-bean.com, as /pub/guile/guile-snap.tar.gz. + +Via the web, that's: ftp://ftp.red-bean.com/pub/guile/guile-snap.tar.gz +For getit, that's: ftp.red-bean.com:/pub/guile/guile-snap.tar.gz + +** To run Guile without installing it, the procedure has changed a bit. + +If you used a separate build directory to compile Guile, you'll need +to include the build directory in SCHEME_LOAD_PATH, as well as the +source directory. See the `INSTALL' file for examples. + +* Changes to the procedure for linking libguile with your programs + +** The standard Guile load path for Scheme code now includes +$(datadir)/guile (usually /usr/local/share/guile). This means that +you can install your own Scheme files there, and Guile will find them. +(Previous versions of Guile only checked a directory whose name +contained the Guile version number, so you had to re-install or move +your Scheme sources each time you installed a fresh version of Guile.) + +The load path also includes $(datadir)/guile/site; we recommend +putting individual Scheme files there. If you want to install a +package with multiple source files, create a directory for them under +$(datadir)/guile. + +** Guile 1.2 will now use the Rx regular expression library, if it is +installed on your system. When you are linking libguile into your own +programs, this means you will have to link against -lguile, -lqt (if +you configured Guile with thread support), and -lrx. + +If you are using autoconf to generate configuration scripts for your +application, the following lines should suffice to add the appropriate +libraries to your link command: + +### Find Rx, quickthreads and libguile. +AC_CHECK_LIB(rx, main) +AC_CHECK_LIB(qt, main) +AC_CHECK_LIB(guile, scm_shell) + +The Guile 1.2 distribution does not contain sources for the Rx +library, as Guile 1.0 did. If you want to use Rx, you'll need to +retrieve it from a GNU FTP site and install it separately. + +* Changes to Scheme functions and syntax + +** The dynamic linking features of Guile are now enabled by default. +You can disable them by giving the `--disable-dynamic-linking' option +to configure. + + (dynamic-link FILENAME) + + Find the object file denoted by FILENAME (a string) and link it + into the running Guile application. When everything works out, + return a Scheme object suitable for representing the linked object + file. Otherwise an error is thrown. How object files are + searched is system dependent. + + (dynamic-object? VAL) + + Determine whether VAL represents a dynamically linked object file. + + (dynamic-unlink DYNOBJ) + + Unlink the indicated object file from the application. DYNOBJ + should be one of the values returned by `dynamic-link'. + + (dynamic-func FUNCTION DYNOBJ) + + Search the C function indicated by FUNCTION (a string or symbol) + in DYNOBJ and return some Scheme object that can later be used + with `dynamic-call' to actually call this function. Right now, + these Scheme objects are formed by casting the address of the + function to `long' and converting this number to its Scheme + representation. + + (dynamic-call FUNCTION DYNOBJ) + + Call the C function indicated by FUNCTION and DYNOBJ. The + function is passed no arguments and its return value is ignored. + When FUNCTION is something returned by `dynamic-func', call that + function and ignore DYNOBJ. When FUNCTION is a string (or symbol, + etc.), look it up in DYNOBJ; this is equivalent to + + (dynamic-call (dynamic-func FUNCTION DYNOBJ) #f) + + Interrupts are deferred while the C function is executing (with + SCM_DEFER_INTS/SCM_ALLOW_INTS). + + (dynamic-args-call FUNCTION DYNOBJ ARGS) + + Call the C function indicated by FUNCTION and DYNOBJ, but pass it + some arguments and return its return value. The C function is + expected to take two arguments and return an `int', just like + `main': + + int c_func (int argc, char **argv); + + ARGS must be a list of strings and is converted into an array of + `char *'. The array is passed in ARGV and its size in ARGC. The + return value is converted to a Scheme number and returned from the + call to `dynamic-args-call'. + +When dynamic linking is disabled or not supported on your system, +the above functions throw errors, but they are still available. + +Here is a small example that works on GNU/Linux: + + (define libc-obj (dynamic-link "libc.so")) + (dynamic-args-call 'rand libc-obj '()) + +See the file `libguile/DYNAMIC-LINKING' for additional comments. + +** The #/ syntax for module names is depreciated, and will be removed +in a future version of Guile. Instead of + + #/foo/bar/baz + +instead write + + (foo bar baz) + +The latter syntax is more consistent with existing Lisp practice. + +** Guile now does fancier printing of structures. Structures are the +underlying implementation for records, which in turn are used to +implement modules, so all of these object now print differently and in +a more informative way. + +The Scheme printer will examine the builtin variable *struct-printer* +whenever it needs to print a structure object. When this variable is +not `#f' it is deemed to be a procedure and will be applied to the +structure object and the output port. When *struct-printer* is `#f' +or the procedure return `#f' the structure object will be printed in +the boring # form. + +This hook is used by some routines in ice-9/boot-9.scm to implement +type specific printing routines. Please read the comments there about +"printing structs". + +One of the more specific uses of structs are records. The printing +procedure that could be passed to MAKE-RECORD-TYPE is now actually +called. It should behave like a *struct-printer* procedure (described +above). + +** Guile now supports a new R4RS-compliant syntax for keywords. A +token of the form #:NAME, where NAME has the same syntax as a Scheme +symbol, is the external representation of the keyword named NAME. +Keyword objects print using this syntax as well, so values containing +keyword objects can be read back into Guile. When used in an +expression, keywords are self-quoting objects. + +Guile suports this read syntax, and uses this print syntax, regardless +of the current setting of the `keyword' read option. The `keyword' +read option only controls whether Guile recognizes the `:NAME' syntax, +which is incompatible with R4RS. (R4RS says such token represent +symbols.) + +** Guile has regular expression support again. Guile 1.0 included +functions for matching regular expressions, based on the Rx library. +In Guile 1.1, the Guile/Rx interface was removed to simplify the +distribution, and thus Guile had no regular expression support. Guile +1.2 again supports the most commonly used functions, and supports all +of SCSH's regular expression functions. + +If your system does not include a POSIX regular expression library, +and you have not linked Guile with a third-party regexp library such as +Rx, these functions will not be available. You can tell whether your +Guile installation includes regular expression support by checking +whether the `*features*' list includes the `regex' symbol. + +*** regexp functions + +By default, Guile supports POSIX extended regular expressions. That +means that the characters `(', `)', `+' and `?' are special, and must +be escaped if you wish to match the literal characters. + +This regular expression interface was modeled after that implemented +by SCSH, the Scheme Shell. It is intended to be upwardly compatible +with SCSH regular expressions. + +**** Function: string-match PATTERN STR [START] + Compile the string PATTERN into a regular expression and compare + it with STR. The optional numeric argument START specifies the + position of STR at which to begin matching. + + `string-match' returns a "match structure" which describes what, + if anything, was matched by the regular expression. *Note Match + Structures::. If STR does not match PATTERN at all, + `string-match' returns `#f'. + + Each time `string-match' is called, it must compile its PATTERN +argument into a regular expression structure. This operation is +expensive, which makes `string-match' inefficient if the same regular +expression is used several times (for example, in a loop). For better +performance, you can compile a regular expression in advance and then +match strings against the compiled regexp. + +**** Function: make-regexp STR [FLAGS] + Compile the regular expression described by STR, and return the + compiled regexp structure. If STR does not describe a legal + regular expression, `make-regexp' throws a + `regular-expression-syntax' error. + + FLAGS may be the bitwise-or of one or more of the following: + +**** Constant: regexp/extended + Use POSIX Extended Regular Expression syntax when interpreting + STR. If not set, POSIX Basic Regular Expression syntax is used. + If the FLAGS argument is omitted, we assume regexp/extended. + +**** Constant: regexp/icase + Do not differentiate case. Subsequent searches using the + returned regular expression will be case insensitive. + +**** Constant: regexp/newline + Match-any-character operators don't match a newline. + + A non-matching list ([^...]) not containing a newline matches a + newline. + + Match-beginning-of-line operator (^) matches the empty string + immediately after a newline, regardless of whether the FLAGS + passed to regexp-exec contain regexp/notbol. + + Match-end-of-line operator ($) matches the empty string + immediately before a newline, regardless of whether the FLAGS + passed to regexp-exec contain regexp/noteol. + +**** Function: regexp-exec REGEXP STR [START [FLAGS]] + Match the compiled regular expression REGEXP against `str'. If + the optional integer START argument is provided, begin matching + from that position in the string. Return a match structure + describing the results of the match, or `#f' if no match could be + found. + + FLAGS may be the bitwise-or of one or more of the following: + +**** Constant: regexp/notbol + The match-beginning-of-line operator always fails to match (but + see the compilation flag regexp/newline above) This flag may be + used when different portions of a string are passed to + regexp-exec and the beginning of the string should not be + interpreted as the beginning of the line. + +**** Constant: regexp/noteol + The match-end-of-line operator always fails to match (but see the + compilation flag regexp/newline above) + +**** Function: regexp? OBJ + Return `#t' if OBJ is a compiled regular expression, or `#f' + otherwise. + + Regular expressions are commonly used to find patterns in one string +and replace them with the contents of another string. + +**** Function: regexp-substitute PORT MATCH [ITEM...] + Write to the output port PORT selected contents of the match + structure MATCH. Each ITEM specifies what should be written, and + may be one of the following arguments: + + * A string. String arguments are written out verbatim. + + * An integer. The submatch with that number is written. + + * The symbol `pre'. The portion of the matched string preceding + the regexp match is written. + + * The symbol `post'. The portion of the matched string + following the regexp match is written. + + PORT may be `#f', in which case nothing is written; instead, + `regexp-substitute' constructs a string from the specified ITEMs + and returns that. + +**** Function: regexp-substitute/global PORT REGEXP TARGET [ITEM...] + Similar to `regexp-substitute', but can be used to perform global + substitutions on STR. Instead of taking a match structure as an + argument, `regexp-substitute/global' takes two string arguments: a + REGEXP string describing a regular expression, and a TARGET string + which should be matched against this regular expression. + + Each ITEM behaves as in REGEXP-SUBSTITUTE, with the following + exceptions: + + * A function may be supplied. When this function is called, it + will be passed one argument: a match structure for a given + regular expression match. It should return a string to be + written out to PORT. + + * The `post' symbol causes `regexp-substitute/global' to recurse + on the unmatched portion of STR. This *must* be supplied in + order to perform global search-and-replace on STR; if it is + not present among the ITEMs, then `regexp-substitute/global' + will return after processing a single match. + +*** Match Structures + + A "match structure" is the object returned by `string-match' and +`regexp-exec'. It describes which portion of a string, if any, matched +the given regular expression. Match structures include: a reference to +the string that was checked for matches; the starting and ending +positions of the regexp match; and, if the regexp included any +parenthesized subexpressions, the starting and ending positions of each +submatch. + + In each of the regexp match functions described below, the `match' +argument must be a match structure returned by a previous call to +`string-match' or `regexp-exec'. Most of these functions return some +information about the original target string that was matched against a +regular expression; we will call that string TARGET for easy reference. + +**** Function: regexp-match? OBJ + Return `#t' if OBJ is a match structure returned by a previous + call to `regexp-exec', or `#f' otherwise. + +**** Function: match:substring MATCH [N] + Return the portion of TARGET matched by subexpression number N. + Submatch 0 (the default) represents the entire regexp match. If + the regular expression as a whole matched, but the subexpression + number N did not match, return `#f'. + +**** Function: match:start MATCH [N] + Return the starting position of submatch number N. + +**** Function: match:end MATCH [N] + Return the ending position of submatch number N. + +**** Function: match:prefix MATCH + Return the unmatched portion of TARGET preceding the regexp match. + +**** Function: match:suffix MATCH + Return the unmatched portion of TARGET following the regexp match. + +**** Function: match:count MATCH + Return the number of parenthesized subexpressions from MATCH. + Note that the entire regular expression match itself counts as a + subexpression, and failed submatches are included in the count. + +**** Function: match:string MATCH + Return the original TARGET string. + +*** Backslash Escapes + + Sometimes you will want a regexp to match characters like `*' or `$' +exactly. For example, to check whether a particular string represents +a menu entry from an Info node, it would be useful to match it against +a regexp like `^* [^:]*::'. However, this won't work; because the +asterisk is a metacharacter, it won't match the `*' at the beginning of +the string. In this case, we want to make the first asterisk un-magic. + + You can do this by preceding the metacharacter with a backslash +character `\'. (This is also called "quoting" the metacharacter, and +is known as a "backslash escape".) When Guile sees a backslash in a +regular expression, it considers the following glyph to be an ordinary +character, no matter what special meaning it would ordinarily have. +Therefore, we can make the above example work by changing the regexp to +`^\* [^:]*::'. The `\*' sequence tells the regular expression engine +to match only a single asterisk in the target string. + + Since the backslash is itself a metacharacter, you may force a +regexp to match a backslash in the target string by preceding the +backslash with itself. For example, to find variable references in a +TeX program, you might want to find occurrences of the string `\let\' +followed by any number of alphabetic characters. The regular expression +`\\let\\[A-Za-z]*' would do this: the double backslashes in the regexp +each match a single backslash in the target string. + +**** Function: regexp-quote STR + Quote each special character found in STR with a backslash, and + return the resulting string. + + *Very important:* Using backslash escapes in Guile source code (as +in Emacs Lisp or C) can be tricky, because the backslash character has +special meaning for the Guile reader. For example, if Guile encounters +the character sequence `\n' in the middle of a string while processing +Scheme code, it replaces those characters with a newline character. +Similarly, the character sequence `\t' is replaced by a horizontal tab. +Several of these "escape sequences" are processed by the Guile reader +before your code is executed. Unrecognized escape sequences are +ignored: if the characters `\*' appear in a string, they will be +translated to the single character `*'. + + This translation is obviously undesirable for regular expressions, +since we want to be able to include backslashes in a string in order to +escape regexp metacharacters. Therefore, to make sure that a backslash +is preserved in a string in your Guile program, you must use *two* +consecutive backslashes: + + (define Info-menu-entry-pattern (make-regexp "^\\* [^:]*")) + + The string in this example is preprocessed by the Guile reader before +any code is executed. The resulting argument to `make-regexp' is the +string `^\* [^:]*', which is what we really want. + + This also means that in order to write a regular expression that +matches a single backslash character, the regular expression string in +the source code must include *four* backslashes. Each consecutive pair +of backslashes gets translated by the Guile reader to a single +backslash, and the resulting double-backslash is interpreted by the +regexp engine as matching a single backslash character. Hence: + + (define tex-variable-pattern (make-regexp "\\\\let\\\\=[A-Za-z]*")) + + The reason for the unwieldiness of this syntax is historical. Both +regular expression pattern matchers and Unix string processing systems +have traditionally used backslashes with the special meanings described +above. The POSIX regular expression specification and ANSI C standard +both require these semantics. Attempting to abandon either convention +would cause other kinds of compatibility problems, possibly more severe +ones. Therefore, without extending the Scheme reader to support +strings with different quoting conventions (an ungainly and confusing +extension when implemented in other languages), we must adhere to this +cumbersome escape syntax. + +* Changes to the gh_ interface + +* Changes to the scm_ interface + +* Changes to system call interfaces: + +** The value returned by `raise' is now unspecified. It throws an exception +if an error occurs. + +*** A new procedure `sigaction' can be used to install signal handlers + +(sigaction signum [action] [flags]) + +signum is the signal number, which can be specified using the value +of SIGINT etc. + +If action is omitted, sigaction returns a pair: the CAR is the current +signal hander, which will be either an integer with the value SIG_DFL +(default action) or SIG_IGN (ignore), or the Scheme procedure which +handles the signal, or #f if a non-Scheme procedure handles the +signal. The CDR contains the current sigaction flags for the handler. + +If action is provided, it is installed as the new handler for signum. +action can be a Scheme procedure taking one argument, or the value of +SIG_DFL (default action) or SIG_IGN (ignore), or #f to restore +whatever signal handler was installed before sigaction was first used. +Flags can optionally be specified for the new handler (SA_RESTART is +always used if the system provides it, so need not be specified.) The +return value is a pair with information about the old handler as +described above. + +This interface does not provide access to the "signal blocking" +facility. Maybe this is not needed, since the thread support may +provide solutions to the problem of consistent access to data +structures. + +*** A new procedure `flush-all-ports' is equivalent to running +`force-output' on every port open for output. + +** Guile now provides information on how it was built, via the new +global variable, %guile-build-info. This variable records the values +of the standard GNU makefile directory variables as an assocation +list, mapping variable names (symbols) onto directory paths (strings). +For example, to find out where the Guile link libraries were +installed, you can say: + +guile -c "(display (assq-ref %guile-build-info 'libdir)) (newline)" + + +* Changes to the scm_ interface + +** The new function scm_handle_by_message_noexit is just like the +existing scm_handle_by_message function, except that it doesn't call +exit to terminate the process. Instead, it prints a message and just +returns #f. This might be a more appropriate catch-all handler for +new dynamic roots and threads. + + +Changes in Guile 1.1 (released Friday, May 16 1997): + +* Changes to the distribution. + +The Guile 1.0 distribution has been split up into several smaller +pieces: +guile-core --- the Guile interpreter itself. +guile-tcltk --- the interface between the Guile interpreter and + Tcl/Tk; Tcl is an interpreter for a stringy language, and Tk + is a toolkit for building graphical user interfaces. +guile-rgx-ctax --- the interface between Guile and the Rx regular + expression matcher, and the translator for the Ctax + programming language. These are packaged together because the + Ctax translator uses Rx to parse Ctax source code. + +This NEWS file describes the changes made to guile-core since the 1.0 +release. + +We no longer distribute the documentation, since it was either out of +date, or incomplete. As soon as we have current documentation, we +will distribute it. + + + +* Changes to the stand-alone interpreter + +** guile now accepts command-line arguments compatible with SCSH, Olin +Shivers' Scheme Shell. + +In general, arguments are evaluated from left to right, but there are +exceptions. The following switches stop argument processing, and +stash all remaining command-line arguments as the value returned by +the (command-line) function. + -s SCRIPT load Scheme source code from FILE, and exit + -c EXPR evalute Scheme expression EXPR, and exit + -- stop scanning arguments; run interactively + +The switches below are processed as they are encountered. + -l FILE load Scheme source code from FILE + -e FUNCTION after reading script, apply FUNCTION to + command line arguments + -ds do -s script at this point + --emacs enable Emacs protocol (experimental) + -h, --help display this help and exit + -v, --version display version information and exit + \ read arguments from following script lines + +So, for example, here is a Guile script named `ekko' (thanks, Olin) +which re-implements the traditional "echo" command: + +#!/usr/local/bin/guile -s +!# +(define (main args) + (map (lambda (arg) (display arg) (display " ")) + (cdr args)) + (newline)) + +(main (command-line)) + +Suppose we invoke this script as follows: + + ekko a speckled gecko + +Through the magic of Unix script processing (triggered by the `#!' +token at the top of the file), /usr/local/bin/guile receives the +following list of command-line arguments: + + ("-s" "./ekko" "a" "speckled" "gecko") + +Unix inserts the name of the script after the argument specified on +the first line of the file (in this case, "-s"), and then follows that +with the arguments given to the script. Guile loads the script, which +defines the `main' function, and then applies it to the list of +remaining command-line arguments, ("a" "speckled" "gecko"). + +In Unix, the first line of a script file must take the following form: + +#!INTERPRETER ARGUMENT + +where INTERPRETER is the absolute filename of the interpreter +executable, and ARGUMENT is a single command-line argument to pass to +the interpreter. + +You may only pass one argument to the interpreter, and its length is +limited. These restrictions can be annoying to work around, so Guile +provides a general mechanism (borrowed from, and compatible with, +SCSH) for circumventing them. + +If the ARGUMENT in a Guile script is a single backslash character, +`\', Guile will open the script file, parse arguments from its second +and subsequent lines, and replace the `\' with them. So, for example, +here is another implementation of the `ekko' script: + +#!/usr/local/bin/guile \ +-e main -s +!# +(define (main args) + (for-each (lambda (arg) (display arg) (display " ")) + (cdr args)) + (newline)) + +If the user invokes this script as follows: + + ekko a speckled gecko + +Unix expands this into + + /usr/local/bin/guile \ ekko a speckled gecko + +When Guile sees the `\' argument, it replaces it with the arguments +read from the second line of the script, producing: + + /usr/local/bin/guile -e main -s ekko a speckled gecko + +This tells Guile to load the `ekko' script, and apply the function +`main' to the argument list ("a" "speckled" "gecko"). + +Here is how Guile parses the command-line arguments: +- Each space character terminates an argument. This means that two + spaces in a row introduce an empty-string argument. +- The tab character is not permitted (unless you quote it with the + backslash character, as described below), to avoid confusion. +- The newline character terminates the sequence of arguments, and will + also terminate a final non-empty argument. (However, a newline + following a space will not introduce a final empty-string argument; + it only terminates the argument list.) +- The backslash character is the escape character. It escapes + backslash, space, tab, and newline. The ANSI C escape sequences + like \n and \t are also supported. These produce argument + constituents; the two-character combination \n doesn't act like a + terminating newline. The escape sequence \NNN for exactly three + octal digits reads as the character whose ASCII code is NNN. As + above, characters produced this way are argument constituents. + Backslash followed by other characters is not allowed. + +* Changes to the procedure for linking libguile with your programs + +** Guile now builds and installs a shared guile library, if your +system support shared libraries. (It still builds a static library on +all systems.) Guile automatically detects whether your system +supports shared libraries. To prevent Guile from buildisg shared +libraries, pass the `--disable-shared' flag to the configure script. + +Guile takes longer to compile when it builds shared libraries, because +it must compile every file twice --- once to produce position- +independent object code, and once to produce normal object code. + +** The libthreads library has been merged into libguile. + +To link a program against Guile, you now need only link against +-lguile and -lqt; -lthreads is no longer needed. If you are using +autoconf to generate configuration scripts for your application, the +following lines should suffice to add the appropriate libraries to +your link command: + +### Find quickthreads and libguile. +AC_CHECK_LIB(qt, main) +AC_CHECK_LIB(guile, scm_shell) + +* Changes to Scheme functions + +** Guile Scheme's special syntax for keyword objects is now optional, +and disabled by default. + +The syntax variation from R4RS made it difficult to port some +interesting packages to Guile. The routines which accepted keyword +arguments (mostly in the module system) have been modified to also +accept symbols whose names begin with `:'. + +To change the keyword syntax, you must first import the (ice-9 debug) +module: + (use-modules (ice-9 debug)) + +Then you can enable the keyword syntax as follows: + (read-set! keywords 'prefix) + +To disable keyword syntax, do this: + (read-set! keywords #f) + +** Many more primitive functions accept shared substrings as +arguments. In the past, these functions required normal, mutable +strings as arguments, although they never made use of this +restriction. + +** The uniform array functions now operate on byte vectors. These +functions are `array-fill!', `serial-array-copy!', `array-copy!', +`serial-array-map', `array-map', `array-for-each', and +`array-index-map!'. + +** The new functions `trace' and `untrace' implement simple debugging +support for Scheme functions. + +The `trace' function accepts any number of procedures as arguments, +and tells the Guile interpreter to display each procedure's name and +arguments each time the procedure is invoked. When invoked with no +arguments, `trace' returns the list of procedures currently being +traced. + +The `untrace' function accepts any number of procedures as arguments, +and tells the Guile interpreter not to trace them any more. When +invoked with no arguments, `untrace' untraces all curretly traced +procedures. + +The tracing in Guile has an advantage over most other systems: we +don't create new procedure objects, but mark the procedure objects +themselves. This means that anonymous and internal procedures can be +traced. + +** The function `assert-repl-prompt' has been renamed to +`set-repl-prompt!'. It takes one argument, PROMPT. +- If PROMPT is #f, the Guile read-eval-print loop will not prompt. +- If PROMPT is a string, we use it as a prompt. +- If PROMPT is a procedure accepting no arguments, we call it, and + display the result as a prompt. +- Otherwise, we display "> ". + +** The new function `eval-string' reads Scheme expressions from a +string and evaluates them, returning the value of the last expression +in the string. If the string contains no expressions, it returns an +unspecified value. + +** The new function `thunk?' returns true iff its argument is a +procedure of zero arguments. + +** `defined?' is now a builtin function, instead of syntax. This +means that its argument should be quoted. It returns #t iff its +argument is bound in the current module. + +** The new syntax `use-modules' allows you to add new modules to your +environment without re-typing a complete `define-module' form. It +accepts any number of module names as arguments, and imports their +public bindings into the current module. + +** The new function (module-defined? NAME MODULE) returns true iff +NAME, a symbol, is defined in MODULE, a module object. + +** The new function `builtin-bindings' creates and returns a hash +table containing copies of all the root module's bindings. + +** The new function `builtin-weak-bindings' does the same as +`builtin-bindings', but creates a doubly-weak hash table. + +** The `equal?' function now considers variable objects to be +equivalent if they have the same name and the same value. + +** The new function `command-line' returns the command-line arguments +given to Guile, as a list of strings. + +When using guile as a script interpreter, `command-line' returns the +script's arguments; those processed by the interpreter (like `-s' or +`-c') are omitted. (In other words, you get the normal, expected +behavior.) Any application that uses scm_shell to process its +command-line arguments gets this behavior as well. + +** The new function `load-user-init' looks for a file called `.guile' +in the user's home directory, and loads it if it exists. This is +mostly for use by the code generated by scm_compile_shell_switches, +but we thought it might also be useful in other circumstances. + +** The new function `log10' returns the base-10 logarithm of its +argument. + +** Changes to I/O functions + +*** The functions `read', `primitive-load', `read-and-eval!', and +`primitive-load-path' no longer take optional arguments controlling +case insensitivity and a `#' parser. + +Case sensitivity is now controlled by a read option called +`case-insensitive'. The user can add new `#' syntaxes with the +`read-hash-extend' function (see below). + +*** The new function `read-hash-extend' allows the user to change the +syntax of Guile Scheme in a somewhat controlled way. + +(read-hash-extend CHAR PROC) + When parsing S-expressions, if we read a `#' character followed by + the character CHAR, use PROC to parse an object from the stream. + If PROC is #f, remove any parsing procedure registered for CHAR. + + The reader applies PROC to two arguments: CHAR and an input port. + +*** The new functions read-delimited and read-delimited! provide a +general mechanism for doing delimited input on streams. + +(read-delimited DELIMS [PORT HANDLE-DELIM]) + Read until we encounter one of the characters in DELIMS (a string), + or end-of-file. PORT is the input port to read from; it defaults to + the current input port. The HANDLE-DELIM parameter determines how + the terminating character is handled; it should be one of the + following symbols: + + 'trim omit delimiter from result + 'peek leave delimiter character in input stream + 'concat append delimiter character to returned value + 'split return a pair: (RESULT . TERMINATOR) + + HANDLE-DELIM defaults to 'peek. + +(read-delimited! DELIMS BUF [PORT HANDLE-DELIM START END]) + A side-effecting variant of `read-delimited'. + + The data is written into the string BUF at the indices in the + half-open interval [START, END); the default interval is the whole + string: START = 0 and END = (string-length BUF). The values of + START and END must specify a well-defined interval in BUF, i.e. + 0 <= START <= END <= (string-length BUF). + + It returns NBYTES, the number of bytes read. If the buffer filled + up without a delimiter character being found, it returns #f. If the + port is at EOF when the read starts, it returns the EOF object. + + If an integer is returned (i.e., the read is successfully terminated + by reading a delimiter character), then the HANDLE-DELIM parameter + determines how to handle the terminating character. It is described + above, and defaults to 'peek. + +(The descriptions of these functions were borrowed from the SCSH +manual, by Olin Shivers and Brian Carlstrom.) + +*** The `%read-delimited!' function is the primitive used to implement +`read-delimited' and `read-delimited!'. + +(%read-delimited! DELIMS BUF GOBBLE? [PORT START END]) + +This returns a pair of values: (TERMINATOR . NUM-READ). +- TERMINATOR describes why the read was terminated. If it is a + character or the eof object, then that is the value that terminated + the read. If it is #f, the function filled the buffer without finding + a delimiting character. +- NUM-READ is the number of characters read into BUF. + +If the read is successfully terminated by reading a delimiter +character, then the gobble? parameter determines what to do with the +terminating character. If true, the character is removed from the +input stream; if false, the character is left in the input stream +where a subsequent read operation will retrieve it. In either case, +the character is also the first value returned by the procedure call. + +(The descriptions of this function was borrowed from the SCSH manual, +by Olin Shivers and Brian Carlstrom.) + +*** The `read-line' and `read-line!' functions have changed; they now +trim the terminator by default; previously they appended it to the +returned string. For the old behavior, use (read-line PORT 'concat). + +*** The functions `uniform-array-read!' and `uniform-array-write!' now +take new optional START and END arguments, specifying the region of +the array to read and write. + +*** The `ungetc-char-ready?' function has been removed. We feel it's +inappropriate for an interface to expose implementation details this +way. + +** Changes to the Unix library and system call interface + +*** The new fcntl function provides access to the Unix `fcntl' system +call. + +(fcntl PORT COMMAND VALUE) + Apply COMMAND to PORT's file descriptor, with VALUE as an argument. + Values for COMMAND are: + + F_DUPFD duplicate a file descriptor + F_GETFD read the descriptor's close-on-exec flag + F_SETFD set the descriptor's close-on-exec flag to VALUE + F_GETFL read the descriptor's flags, as set on open + F_SETFL set the descriptor's flags, as set on open to VALUE + F_GETOWN return the process ID of a socket's owner, for SIGIO + F_SETOWN set the process that owns a socket to VALUE, for SIGIO + FD_CLOEXEC not sure what this is + +For details, see the documentation for the fcntl system call. + +*** The arguments to `select' have changed, for compatibility with +SCSH. The TIMEOUT parameter may now be non-integral, yielding the +expected behavior. The MILLISECONDS parameter has been changed to +MICROSECONDS, to more closely resemble the underlying system call. +The RVEC, WVEC, and EVEC arguments can now be vectors; the type of the +corresponding return set will be the same. + +*** The arguments to the `mknod' system call have changed. They are +now: + +(mknod PATH TYPE PERMS DEV) + Create a new file (`node') in the file system. PATH is the name of + the file to create. TYPE is the kind of file to create; it should + be 'fifo, 'block-special, or 'char-special. PERMS specifies the + permission bits to give the newly created file. If TYPE is + 'block-special or 'char-special, DEV specifies which device the + special file refers to; its interpretation depends on the kind of + special file being created. + +*** The `fork' function has been renamed to `primitive-fork', to avoid +clashing with various SCSH forks. + +*** The `recv' and `recvfrom' functions have been renamed to `recv!' +and `recvfrom!'. They no longer accept a size for a second argument; +you must pass a string to hold the received value. They no longer +return the buffer. Instead, `recv' returns the length of the message +received, and `recvfrom' returns a pair containing the packet's length +and originating address. + +*** The file descriptor datatype has been removed, as have the +`read-fd', `write-fd', `close', `lseek', and `dup' functions. +We plan to replace these functions with a SCSH-compatible interface. + +*** The `create' function has been removed; it's just a special case +of `open'. + +*** There are new functions to break down process termination status +values. In the descriptions below, STATUS is a value returned by +`waitpid'. + +(status:exit-val STATUS) + If the child process exited normally, this function returns the exit + code for the child process (i.e., the value passed to exit, or + returned from main). If the child process did not exit normally, + this function returns #f. + +(status:stop-sig STATUS) + If the child process was suspended by a signal, this function + returns the signal that suspended the child. Otherwise, it returns + #f. + +(status:term-sig STATUS) + If the child process terminated abnormally, this function returns + the signal that terminated the child. Otherwise, this function + returns false. + +POSIX promises that exactly one of these functions will return true on +a valid STATUS value. + +These functions are compatible with SCSH. + +*** There are new accessors and setters for the broken-out time vectors +returned by `localtime', `gmtime', and that ilk. They are: + + Component Accessor Setter + ========================= ============ ============ + seconds tm:sec set-tm:sec + minutes tm:min set-tm:min + hours tm:hour set-tm:hour + day of the month tm:mday set-tm:mday + month tm:mon set-tm:mon + year tm:year set-tm:year + day of the week tm:wday set-tm:wday + day in the year tm:yday set-tm:yday + daylight saving time tm:isdst set-tm:isdst + GMT offset, seconds tm:gmtoff set-tm:gmtoff + name of time zone tm:zone set-tm:zone + +*** There are new accessors for the vectors returned by `uname', +describing the host system: + + Component Accessor + ============================================== ================ + name of the operating system implementation utsname:sysname + network name of this machine utsname:nodename + release level of the operating system utsname:release + version level of the operating system utsname:version + machine hardware platform utsname:machine + +*** There are new accessors for the vectors returned by `getpw', +`getpwnam', `getpwuid', and `getpwent', describing entries from the +system's user database: + + Component Accessor + ====================== ================= + user name passwd:name + user password passwd:passwd + user id passwd:uid + group id passwd:gid + real name passwd:gecos + home directory passwd:dir + shell program passwd:shell + +*** There are new accessors for the vectors returned by `getgr', +`getgrnam', `getgrgid', and `getgrent', describing entries from the +system's group database: + + Component Accessor + ======================= ============ + group name group:name + group password group:passwd + group id group:gid + group members group:mem + +*** There are new accessors for the vectors returned by `gethost', +`gethostbyaddr', `gethostbyname', and `gethostent', describing +internet hosts: + + Component Accessor + ========================= =============== + official name of host hostent:name + alias list hostent:aliases + host address type hostent:addrtype + length of address hostent:length + list of addresses hostent:addr-list + +*** There are new accessors for the vectors returned by `getnet', +`getnetbyaddr', `getnetbyname', and `getnetent', describing internet +networks: + + Component Accessor + ========================= =============== + official name of net netent:name + alias list netent:aliases + net number type netent:addrtype + net number netent:net + +*** There are new accessors for the vectors returned by `getproto', +`getprotobyname', `getprotobynumber', and `getprotoent', describing +internet protocols: + + Component Accessor + ========================= =============== + official protocol name protoent:name + alias list protoent:aliases + protocol number protoent:proto + +*** There are new accessors for the vectors returned by `getserv', +`getservbyname', `getservbyport', and `getservent', describing +internet protocols: + + Component Accessor + ========================= =============== + official service name servent:name + alias list servent:aliases + port number servent:port + protocol to use servent:proto + +*** There are new accessors for the sockaddr structures returned by +`accept', `getsockname', `getpeername', `recvfrom!': + + Component Accessor + ======================================== =============== + address format (`family') sockaddr:fam + path, for file domain addresses sockaddr:path + address, for internet domain addresses sockaddr:addr + TCP or UDP port, for internet sockaddr:port + +*** The `getpwent', `getgrent', `gethostent', `getnetent', +`getprotoent', and `getservent' functions now return #f at the end of +the user database. (They used to throw an exception.) + +Note that calling MUMBLEent function is equivalent to calling the +corresponding MUMBLE function with no arguments. + +*** The `setpwent', `setgrent', `sethostent', `setnetent', +`setprotoent', and `setservent' routines now take no arguments. + +*** The `gethost', `getproto', `getnet', and `getserv' functions now +provide more useful information when they throw an exception. + +*** The `lnaof' function has been renamed to `inet-lnaof'. + +*** Guile now claims to have the `current-time' feature. + +*** The `mktime' function now takes an optional second argument ZONE, +giving the time zone to use for the conversion. ZONE should be a +string, in the same format as expected for the "TZ" environment variable. + +*** The `strptime' function now returns a pair (TIME . COUNT), where +TIME is the parsed time as a vector, and COUNT is the number of +characters from the string left unparsed. This function used to +return the remaining characters as a string. + +*** The `gettimeofday' function has replaced the old `time+ticks' function. +The return value is now (SECONDS . MICROSECONDS); the fractional +component is no longer expressed in "ticks". + +*** The `ticks/sec' constant has been removed, in light of the above change. + +* Changes to the gh_ interface + +** gh_eval_str() now returns an SCM object which is the result of the +evaluation + +** gh_scm2str() now copies the Scheme data to a caller-provided C +array + +** gh_scm2newstr() now makes a C array, copies the Scheme data to it, +and returns the array + +** gh_scm2str0() is gone: there is no need to distinguish +null-terminated from non-null-terminated, since gh_scm2newstr() allows +the user to interpret the data both ways. + +* Changes to the scm_ interface + +** The new function scm_symbol_value0 provides an easy way to get a +symbol's value from C code: + +SCM scm_symbol_value0 (char *NAME) + Return the value of the symbol named by the null-terminated string + NAME in the current module. If the symbol named NAME is unbound in + the current module, return SCM_UNDEFINED. + +** The new function scm_sysintern0 creates new top-level variables, +without assigning them a value. + +SCM scm_sysintern0 (char *NAME) + Create a new Scheme top-level variable named NAME. NAME is a + null-terminated string. Return the variable's value cell. + +** The function scm_internal_catch is the guts of catch. It handles +all the mechanics of setting up a catch target, invoking the catch +body, and perhaps invoking the handler if the body does a throw. + +The function is designed to be usable from C code, but is general +enough to implement all the semantics Guile Scheme expects from throw. + +TAG is the catch tag. Typically, this is a symbol, but this function +doesn't actually care about that. + +BODY is a pointer to a C function which runs the body of the catch; +this is the code you can throw from. We call it like this: + BODY (BODY_DATA, JMPBUF) +where: + BODY_DATA is just the BODY_DATA argument we received; we pass it + through to BODY as its first argument. The caller can make + BODY_DATA point to anything useful that BODY might need. + JMPBUF is the Scheme jmpbuf object corresponding to this catch, + which we have just created and initialized. + +HANDLER is a pointer to a C function to deal with a throw to TAG, +should one occur. We call it like this: + HANDLER (HANDLER_DATA, THROWN_TAG, THROW_ARGS) +where + HANDLER_DATA is the HANDLER_DATA argument we recevied; it's the + same idea as BODY_DATA above. + THROWN_TAG is the tag that the user threw to; usually this is + TAG, but it could be something else if TAG was #t (i.e., a + catch-all), or the user threw to a jmpbuf. + THROW_ARGS is the list of arguments the user passed to the THROW + function. + +BODY_DATA is just a pointer we pass through to BODY. HANDLER_DATA +is just a pointer we pass through to HANDLER. We don't actually +use either of those pointers otherwise ourselves. The idea is +that, if our caller wants to communicate something to BODY or +HANDLER, it can pass a pointer to it as MUMBLE_DATA, which BODY and +HANDLER can then use. Think of it as a way to make BODY and +HANDLER closures, not just functions; MUMBLE_DATA points to the +enclosed variables. + +Of course, it's up to the caller to make sure that any data a +MUMBLE_DATA needs is protected from GC. A common way to do this is +to make MUMBLE_DATA a pointer to data stored in an automatic +structure variable; since the collector must scan the stack for +references anyway, this assures that any references in MUMBLE_DATA +will be found. + +** The new function scm_internal_lazy_catch is exactly like +scm_internal_catch, except: + +- It does not unwind the stack (this is the major difference). +- If handler returns, its value is returned from the throw. +- BODY always receives #f as its JMPBUF argument (since there's no + jmpbuf associated with a lazy catch, because we don't unwind the + stack.) + +** scm_body_thunk is a new body function you can pass to +scm_internal_catch if you want the body to be like Scheme's `catch' +--- a thunk, or a function of one argument if the tag is #f. + +BODY_DATA is a pointer to a scm_body_thunk_data structure, which +contains the Scheme procedure to invoke as the body, and the tag +we're catching. If the tag is #f, then we pass JMPBUF (created by +scm_internal_catch) to the body procedure; otherwise, the body gets +no arguments. + +** scm_handle_by_proc is a new handler function you can pass to +scm_internal_catch if you want the handler to act like Scheme's catch +--- call a procedure with the tag and the throw arguments. + +If the user does a throw to this catch, this function runs a handler +procedure written in Scheme. HANDLER_DATA is a pointer to an SCM +variable holding the Scheme procedure object to invoke. It ought to +be a pointer to an automatic variable (i.e., one living on the stack), +or the procedure object should be otherwise protected from GC. + +** scm_handle_by_message is a new handler function to use with +`scm_internal_catch' if you want Guile to print a message and die. +It's useful for dealing with throws to uncaught keys at the top level. + +HANDLER_DATA, if non-zero, is assumed to be a char * pointing to a +message header to print; if zero, we use "guile" instead. That +text is followed by a colon, then the message described by ARGS. + +** The return type of scm_boot_guile is now void; the function does +not return a value, and indeed, never returns at all. + +** The new function scm_shell makes it easy for user applications to +process command-line arguments in a way that is compatible with the +stand-alone guile interpreter (which is in turn compatible with SCSH, +the Scheme shell). + +To use the scm_shell function, first initialize any guile modules +linked into your application, and then call scm_shell with the values +of ARGC and ARGV your `main' function received. scm_shell will add +any SCSH-style meta-arguments from the top of the script file to the +argument vector, and then process the command-line arguments. This +generally means loading a script file or starting up an interactive +command interpreter. For details, see "Changes to the stand-alone +interpreter" above. + +** The new functions scm_get_meta_args and scm_count_argv help you +implement the SCSH-style meta-argument, `\'. + +char **scm_get_meta_args (int ARGC, char **ARGV) + If the second element of ARGV is a string consisting of a single + backslash character (i.e. "\\" in Scheme notation), open the file + named by the following argument, parse arguments from it, and return + the spliced command line. The returned array is terminated by a + null pointer. + + For details of argument parsing, see above, under "guile now accepts + command-line arguments compatible with SCSH..." + +int scm_count_argv (char **ARGV) + Count the arguments in ARGV, assuming it is terminated by a null + pointer. + +For an example of how these functions might be used, see the source +code for the function scm_shell in libguile/script.c. + +You will usually want to use scm_shell instead of calling this +function yourself. + +** The new function scm_compile_shell_switches turns an array of +command-line arguments into Scheme code to carry out the actions they +describe. Given ARGC and ARGV, it returns a Scheme expression to +evaluate, and calls scm_set_program_arguments to make any remaining +command-line arguments available to the Scheme code. For example, +given the following arguments: + + -e main -s ekko a speckled gecko + +scm_set_program_arguments will return the following expression: + + (begin (load "ekko") (main (command-line)) (quit)) + +You will usually want to use scm_shell instead of calling this +function yourself. + +** The function scm_shell_usage prints a usage message appropriate for +an interpreter that uses scm_compile_shell_switches to handle its +command-line arguments. + +void scm_shell_usage (int FATAL, char *MESSAGE) + Print a usage message to the standard error output. If MESSAGE is + non-zero, write it before the usage message, followed by a newline. + If FATAL is non-zero, exit the process, using FATAL as the + termination status. (If you want to be compatible with Guile, + always use 1 as the exit status when terminating due to command-line + usage problems.) + +You will usually want to use scm_shell instead of calling this +function yourself. + +** scm_eval_0str now returns SCM_UNSPECIFIED if the string contains no +expressions. It used to return SCM_EOL. Earth-shattering. + +** The macros for declaring scheme objects in C code have been +rearranged slightly. They are now: + +SCM_SYMBOL (C_NAME, SCHEME_NAME) + Declare a static SCM variable named C_NAME, and initialize it to + point to the Scheme symbol whose name is SCHEME_NAME. C_NAME should + be a C identifier, and SCHEME_NAME should be a C string. + +SCM_GLOBAL_SYMBOL (C_NAME, SCHEME_NAME) + Just like SCM_SYMBOL, but make C_NAME globally visible. + +SCM_VCELL (C_NAME, SCHEME_NAME) + Create a global variable at the Scheme level named SCHEME_NAME. + Declare a static SCM variable named C_NAME, and initialize it to + point to the Scheme variable's value cell. + +SCM_GLOBAL_VCELL (C_NAME, SCHEME_NAME) + Just like SCM_VCELL, but make C_NAME globally visible. + +The `guile-snarf' script writes initialization code for these macros +to its standard output, given C source code as input. + +The SCM_GLOBAL macro is gone. + +** The scm_read_line and scm_read_line_x functions have been replaced +by Scheme code based on the %read-delimited! procedure (known to C +code as scm_read_delimited_x). See its description above for more +information. + +** The function scm_sys_open has been renamed to scm_open. It now +returns a port instead of an FD object. + +* The dynamic linking support has changed. For more information, see +libguile/DYNAMIC-LINKING. + + +Guile 1.0b3 + +User-visible changes from Thursday, September 5, 1996 until Guile 1.0 +(Sun 5 Jan 1997): + +* Changes to the 'guile' program: + +** Guile now loads some new files when it starts up. Guile first +searches the load path for init.scm, and loads it if found. Then, if +Guile is not being used to execute a script, and the user's home +directory contains a file named `.guile', Guile loads that. + +** You can now use Guile as a shell script interpreter. + +To paraphrase the SCSH manual: + + When Unix tries to execute an executable file whose first two + characters are the `#!', it treats the file not as machine code to + be directly executed by the native processor, but as source code + to be executed by some interpreter. The interpreter to use is + specified immediately after the #! sequence on the first line of + the source file. The kernel reads in the name of the interpreter, + and executes that instead. It passes the interpreter the source + filename as its first argument, with the original arguments + following. Consult the Unix man page for the `exec' system call + for more information. + +Now you can use Guile as an interpreter, using a mechanism which is a +compatible subset of that provided by SCSH. + +Guile now recognizes a '-s' command line switch, whose argument is the +name of a file of Scheme code to load. It also treats the two +characters `#!' as the start of a comment, terminated by `!#'. Thus, +to make a file of Scheme code directly executable by Unix, insert the +following two lines at the top of the file: + +#!/usr/local/bin/guile -s +!# + +Guile treats the argument of the `-s' command-line switch as the name +of a file of Scheme code to load, and treats the sequence `#!' as the +start of a block comment, terminated by `!#'. + +For example, here's a version of 'echo' written in Scheme: + +#!/usr/local/bin/guile -s +!# +(let loop ((args (cdr (program-arguments)))) + (if (pair? args) + (begin + (display (car args)) + (if (pair? (cdr args)) + (display " ")) + (loop (cdr args))))) +(newline) + +Why does `#!' start a block comment terminated by `!#', instead of the +end of the line? That is the notation SCSH uses, and although we +don't yet support the other SCSH features that motivate that choice, +we would like to be backward-compatible with any existing Guile +scripts once we do. Furthermore, if the path to Guile on your system +is too long for your kernel, you can start the script with this +horrible hack: + +#!/bin/sh +exec /really/long/path/to/guile -s "$0" ${1+"$@"} +!# + +Note that some very old Unix systems don't support the `#!' syntax. + + +** You can now run Guile without installing it. + +Previous versions of the interactive Guile interpreter (`guile') +couldn't start up unless Guile's Scheme library had been installed; +they used the value of the environment variable `SCHEME_LOAD_PATH' +later on in the startup process, but not to find the startup code +itself. Now Guile uses `SCHEME_LOAD_PATH' in all searches for Scheme +code. + +To run Guile without installing it, build it in the normal way, and +then set the environment variable `SCHEME_LOAD_PATH' to a +colon-separated list of directories, including the top-level directory +of the Guile sources. For example, if you unpacked Guile so that the +full filename of this NEWS file is /home/jimb/guile-1.0b3/NEWS, then +you might say + + export SCHEME_LOAD_PATH=/home/jimb/my-scheme:/home/jimb/guile-1.0b3 + + +** Guile's read-eval-print loop no longer prints # +results. If the user wants to see this, she can evaluate the +expression (assert-repl-print-unspecified #t), perhaps in her startup +file. + +** Guile no longer shows backtraces by default when an error occurs; +however, it does display a message saying how to get one, and how to +request that they be displayed by default. After an error, evaluate + (backtrace) +to see a backtrace, and + (debug-enable 'backtrace) +to see them by default. + + + +* Changes to Guile Scheme: + +** Guile now distinguishes between #f and the empty list. + +This is for compatibility with the IEEE standard, the (possibly) +upcoming Revised^5 Report on Scheme, and many extant Scheme +implementations. + +Guile used to have #f and '() denote the same object, to make Scheme's +type system more compatible with Emacs Lisp's. However, the change +caused too much trouble for Scheme programmers, and we found another +way to reconcile Emacs Lisp with Scheme that didn't require this. + + +** Guile's delq, delv, delete functions, and their destructive +counterparts, delq!, delv!, and delete!, now remove all matching +elements from the list, not just the first. This matches the behavior +of the corresponding Emacs Lisp functions, and (I believe) the Maclisp +functions which inspired them. + +I recognize that this change may break code in subtle ways, but it +seems best to make the change before the FSF's first Guile release, +rather than after. + + +** The compiled-library-path function has been deleted from libguile. + +** The facilities for loading Scheme source files have changed. + +*** The variable %load-path now tells Guile which directories to search +for Scheme code. Its value is a list of strings, each of which names +a directory. + +*** The variable %load-extensions now tells Guile which extensions to +try appending to a filename when searching the load path. Its value +is a list of strings. Its default value is ("" ".scm"). + +*** (%search-load-path FILENAME) searches the directories listed in the +value of the %load-path variable for a Scheme file named FILENAME, +with all the extensions listed in %load-extensions. If it finds a +match, then it returns its full filename. If FILENAME is absolute, it +returns it unchanged. Otherwise, it returns #f. + +%search-load-path will not return matches that refer to directories. + +*** (primitive-load FILENAME :optional CASE-INSENSITIVE-P SHARP) +uses %seach-load-path to find a file named FILENAME, and loads it if +it finds it. If it can't read FILENAME for any reason, it throws an +error. + +The arguments CASE-INSENSITIVE-P and SHARP are interpreted as by the +`read' function. + +*** load uses the same searching semantics as primitive-load. + +*** The functions %try-load, try-load-with-path, %load, load-with-path, +basic-try-load-with-path, basic-load-with-path, try-load-module-with- +path, and load-module-with-path have been deleted. The functions +above should serve their purposes. + +*** If the value of the variable %load-hook is a procedure, +`primitive-load' applies its value to the name of the file being +loaded (without the load path directory name prepended). If its value +is #f, it is ignored. Otherwise, an error occurs. + +This is mostly useful for printing load notification messages. + + +** The function `eval!' is no longer accessible from the scheme level. +We can't allow operations which introduce glocs into the scheme level, +because Guile's type system can't handle these as data. Use `eval' or +`read-and-eval!' (see below) as replacement. + +** The new function read-and-eval! reads an expression from PORT, +evaluates it, and returns the result. This is more efficient than +simply calling `read' and `eval', since it is not necessary to make a +copy of the expression for the evaluator to munge. + +Its optional arguments CASE_INSENSITIVE_P and SHARP are interpreted as +for the `read' function. + + +** The function `int?' has been removed; its definition was identical +to that of `integer?'. + +** The functions `?', and `>=?'. Code should +use the R4RS names for these functions. + +** The function object-properties no longer returns the hash handle; +it simply returns the object's property list. + +** Many functions have been changed to throw errors, instead of +returning #f on failure. The point of providing exception handling in +the language is to simplify the logic of user code, but this is less +useful if Guile's primitives don't throw exceptions. + +** The function `fileno' has been renamed from `%fileno'. + +** The function primitive-mode->fdes returns #t or #f now, not 1 or 0. + + +* Changes to Guile's C interface: + +** The library's initialization procedure has been simplified. +scm_boot_guile now has the prototype: + +void scm_boot_guile (int ARGC, + char **ARGV, + void (*main_func) (), + void *closure); + +scm_boot_guile calls MAIN_FUNC, passing it CLOSURE, ARGC, and ARGV. +MAIN_FUNC should do all the work of the program (initializing other +packages, reading user input, etc.) before returning. When MAIN_FUNC +returns, call exit (0); this function never returns. If you want some +other exit value, MAIN_FUNC may call exit itself. + +scm_boot_guile arranges for program-arguments to return the strings +given by ARGC and ARGV. If MAIN_FUNC modifies ARGC/ARGV, should call +scm_set_program_arguments with the final list, so Scheme code will +know which arguments have been processed. + +scm_boot_guile establishes a catch-all catch handler which prints an +error message and exits the process. This means that Guile exits in a +coherent way when system errors occur and the user isn't prepared to +handle it. If the user doesn't like this behavior, they can establish +their own universal catcher in MAIN_FUNC to shadow this one. + +Why must the caller do all the real work from MAIN_FUNC? The garbage +collector assumes that all local variables of type SCM will be above +scm_boot_guile's stack frame on the stack. If you try to manipulate +SCM values after this function returns, it's the luck of the draw +whether the GC will be able to find the objects you allocate. So, +scm_boot_guile function exits, rather than returning, to discourage +people from making that mistake. + +The IN, OUT, and ERR arguments were removed; there are other +convenient ways to override these when desired. + +The RESULT argument was deleted; this function should never return. + +The BOOT_CMD argument was deleted; the MAIN_FUNC argument is more +general. + + +** Guile's header files should no longer conflict with your system's +header files. + +In order to compile code which #included , previous +versions of Guile required you to add a directory containing all the +Guile header files to your #include path. This was a problem, since +Guile's header files have names which conflict with many systems' +header files. + +Now only need appear in your #include path; you must +refer to all Guile's other header files as . +Guile's installation procedure puts libguile.h in $(includedir), and +the rest in $(includedir)/libguile. + + +** Two new C functions, scm_protect_object and scm_unprotect_object, +have been added to the Guile library. + +scm_protect_object (OBJ) protects OBJ from the garbage collector. +OBJ will not be freed, even if all other references are dropped, +until someone does scm_unprotect_object (OBJ). Both functions +return OBJ. + +Note that calls to scm_protect_object do not nest. You can call +scm_protect_object any number of times on a given object, and the +next call to scm_unprotect_object will unprotect it completely. + +Basically, scm_protect_object and scm_unprotect_object just +maintain a list of references to things. Since the GC knows about +this list, all objects it mentions stay alive. scm_protect_object +adds its argument to the list; scm_unprotect_object remove its +argument from the list. + + +** scm_eval_0str now returns the value of the last expression +evaluated. + +** The new function scm_read_0str reads an s-expression from a +null-terminated string, and returns it. + +** The new function `scm_stdio_to_port' converts a STDIO file pointer +to a Scheme port object. + +** The new function `scm_set_program_arguments' allows C code to set +the value returned by the Scheme `program-arguments' function. + + +Older changes: + +* Guile no longer includes sophisticated Tcl/Tk support. + +The old Tcl/Tk support was unsatisfying to us, because it required the +user to link against the Tcl library, as well as Tk and Guile. The +interface was also un-lispy, in that it preserved Tcl/Tk's practice of +referring to widgets by names, rather than exporting widgets to Scheme +code as a special datatype. + +In the Usenix Tk Developer's Workshop held in July 1996, the Tcl/Tk +maintainers described some very interesting changes in progress to the +Tcl/Tk internals, which would facilitate clean interfaces between lone +Tk and other interpreters --- even for garbage-collected languages +like Scheme. They expected the new Tk to be publicly available in the +fall of 1996. + +Since it seems that Guile might soon have a new, cleaner interface to +lone Tk, and that the old Guile/Tk glue code would probably need to be +completely rewritten, we (Jim Blandy and Richard Stallman) have +decided not to support the old code. We'll spend the time instead on +a good interface to the newer Tk, as soon as it is available. + +Until then, gtcltk-lib provides trivial, low-maintenance functionality. + + +Copyright information: + +Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2006 Free Software Foundation, Inc. + + Permission is granted to anyone to make or distribute verbatim copies + of this document as received, in any medium, provided that the + copyright notice and this permission notice are preserved, + thus giving the recipient permission to redistribute in turn. + + Permission is granted to distribute modified versions + of this document, or of portions of it, + under the above conditions, provided also that they + carry prominent notices stating who last changed them. + + +Local variables: +mode: outline +paragraph-separate: "[ ]*$" +end: diff --git a/guile18/README b/guile18/README new file mode 100644 index 0000000000..32300a8666 --- /dev/null +++ b/guile18/README @@ -0,0 +1,382 @@ +This is version 1.8.7 of Guile, Project GNU's extension language +library. Guile is an interpreter for Scheme, packaged as a library +that you can link into your applications to give them their own +scripting language. Guile will eventually support other languages as +well, giving users of Guile-based applications a choice of languages. + +Please send bug reports to bug-guile@gnu.org. + +See the LICENSE file for the specific terms that apply to Guile. + + +Additional INSTALL instructions =========================================== + +Generic instructions for configuring and compiling Guile can be found +in the INSTALL file. Guile specific information and configure options +can be found below, including instructions for installing SLIB. + +Guile requires a few external packages and can optionally use a number +of external packages such as `readline' when they are available. +Guile expects to be able to find these packages in the default +compiler setup, it does not try to make any special arrangements +itself. For example, for the `readline' package, Guile expects to be +able to find the include file , without passing +any special `-I' options to the compiler. + +If you installed an external package, and you used the --prefix +installation option to install it somewhere else than /usr/local, you +must arrange for your compiler to find it by default. If that +compiler is gcc, one convenient way of making such arrangements is to +use the --with-local-prefix option during installation, naming the +same directory as you used in the --prefix option of the package. In +particular, it is not good enough to use the same --prefix option when +you install gcc and the package; you need to use the +--with-local-prefix option as well. See the gcc documentation for +more details. + + +Required External Packages ================================================ + +Guile requires the following external packages: + + - GNU MP, at least version 4.1 + + GNU MP is used for bignum arithmetic. It is available from + http://swox.com/gmp + + - libltdl from libtool, at least from libtool version 1.5.6 + + libltdl is used for loading extensions at run-time. It is + available from http://www.gnu.org/software/libtool/ + + +Guile specific flags Accepted by Configure ================================= + +If you run the configure script with no arguments, it should examine +your system and set things up appropriately. However, there are a few +switches specific to Guile you may find useful in some circumstances. + +--without-threads --- Build without thread support + + Build a Guile executable and library that supports multi-threading. + + The default is to enable threading support when your operating + system offsers 'POSIX threads'. When you do not want threading, use + `--without-threads'. + +--enable-deprecated=LEVEL + + Guile may contain features that are `deprecated'. When a feature is + deprecated, it means that it is still there, but that there is a + better way of achieving the same thing, and we'd rather have you use + this better way. This allows us to eventually remove the old + implementation and helps to keep Guile reasonably clean of historic + baggage. + + Deprecated features are considered harmful; using them is likely a + bug. See below for the related notion of `discouraged' features, + which are OK but have fallen out of favor. + + See the file NEWS for a list of features that are currently + deprecated. Each entry will also tell you what you should replace + your code with. + + To give you some help with this process, and to encourage (OK, + nudge) people to switch to the newer methods, Guile can emit + warnings or errors when you use a deprecated feature. There is + quite a range of possibilities, from being completely silent to + giving errors at link time. What exactly happens is determined both + by the value of the `--enable-deprecated' configuration option when + Guile was built, and by the GUILE_WARN_DEPRECATED environment + variable. + + It works like this: + + When Guile has been configured with `--enable-deprecated=no' (or, + equivalently, with `--disable-deprecated') then all deprecated + features are omitted from Guile. You will get "undefined + reference", "variable unbound" or similar errors when you try to + use them. + + When `--enable-deprecated=LEVEL' has been specified (for LEVEL not + "no"), LEVEL will be used as the default value of the environment + variable GUILE_WARN_DEPRECATED. A value of "yes" is changed to + "summary" and "shutup" is changed to "no", however. + + When GUILE_WARN_DEPRECATED has the value "no", nothing special + will happen when a deprecated feature is used. + + When GUILE_WARN_DEPRECATED has the value "summary", and a + deprecated feature has been used, Guile will print this message at + exit: + + Some deprecated features have been used. Set the environment + variable GUILE_WARN_DEPRECATED to "detailed" and rerun the + program to get more information. Set it to "no" to suppress + this message. + + When GUILE_WARN_DEPRECATED has the value "detailed", a detailed + warning is emitted immediatly for the first use of a deprecated + feature. + + The default is `--enable-deprecated=yes'. + + In addition to setting GUILE_WARN_DEPRECATED in the environment, you + can also use (debug-enable 'warn-deprecated) and (debug-disable + 'warn-deprecated) to enable and disable the detailed messaged at run + time. + +--disable-discouraged + + In addition to deprecated features, Guile can also contain things + that are merely `discouraged'. It is OK to continue to use these + features in old code, but new code should avoid them since there are + better alternatives. + + There is nothing wrong with a discouraged feature per se, but they + might have strange names, or be non-standard, for example. Avoiding + them will make your code better. + +--disable-shared --- Do not build shared libraries. +--disable-static --- Do not build static libraries. + + Normally, both static and shared libraries will be built if your + system supports them. + +--enable-debug-freelist --- Enable freelist debugging. + + This enables a debugging version of scm_cell and scm_double_cell, + and also registers an extra primitive, the setter + `gc-set-debug-check-freelist!'. + + Configure with the --enable-debug-freelist option to enable the + gc-set-debug-check-freelist! primitive, and then use: + + (gc-set-debug-check-freelist! #t) # turn on checking of the freelist + (gc-set-debug-check-freelist! #f) # turn off checking + + Checking of the freelist forces a traversal of the freelist and a + garbage collection before each allocation of a cell. This can slow + down the interpreter dramatically, so the setter should be used to + turn on this extra processing only when necessary. + +--enable-debug-malloc --- Enable malloc debugging. + + Include code for debugging of calls to scm_malloc, scm_realloc, etc. + + It records the number of allocated objects of each kind. This is + useful when searching for memory leaks. + + A Guile compiled with this option provides the primitive + `malloc-stats' which returns an alist with pairs of kind and the + number of objects of that kind. + +--enable-guile-debug --- Include internal debugging functions +--disable-posix --- omit posix interfaces +--disable-networking --- omit networking interfaces +--disable-regex --- omit regular expression interfaces + + +Cross building Guile ===================================================== + +Guile can be cross-compiled for Windows using the i586-mingw32msvc +cross-compiler. To do this, you first need to cross-build Guile's +prerequisites - GNU MP and libtool/libltdl (as described above) - and +then cross-build Guile itself. + +For each of these steps, configure using an invocation like this: + +CPPFLAGS=-I/usr/local/i586-mingw32msvc/include \ +LDFLAGS=-L/usr/local/i586-mingw32msvc/lib \ +GUILE_FOR_BUILD=/usr/local/bin/guile \ +./configure --prefix=/usr/local/i586-mingw32msvc --host=i586-mingw32msvc + +Then run `make' - which should complete without any errors - and `sudo +make install'. (`make check' doesn't work when cross-compiling, +because the built DLLs and program cannot be run on GNU/Linux.) + +The `GUILE_FOR_BUILD=...' setting is needed because some later steps +of the build process use Guile itself. In the non-cross-compiling +case this is the version of Guile that has just been built. When +cross-compiling, you have to set GUILE_FOR_BUILD to tell the build +where it can find a native version of Guile, to use for these steps. + +Cross-compiling for other hosts may also work, using the following +instructions; but this has not been recently tested. + +To configure Guile for cross building, for example for Cygwin: + + ./configure --host=i686-pc-cygwin --disable-shared + +A C compiler for the build system is required. The default is +"PATH=/usr/bin:$PATH cc". If that doesn't suit it can be specified +with the CC_FOR_BUILD variable in the usual way, for instance + + ./configure --host=m68k-unknown-linux-gnu CC_FOR_BUILD=/my/local/gcc + +Guile for the build system can be specified similarly with the +GUILE_FOR_BUILD variable, it defaults to just "guile". + + +Using Guile Without Installing It ========================================= + +The top directory of the Guile sources contains a script called +"pre-inst-guile" that can be used to run the Guile that has just been +built. + + +Installing SLIB =========================================================== + +In order to use SLIB from Guile you basically only need to put the +`slib' directory _in_ one of the directories on Guile's load path. + +The standard installation is: + + 1. Obtain slib from http://www-swiss.ai.mit.edu/~jaffer/SLIB.html + + 2. Put it in Guile's data directory, that is the directory printed when + you type + + guile-config info pkgdatadir + + at the shell prompt. This is normally `/usr/local/share/guile', so the + directory will normally have full path `/usr/local/share/guile/slib'. + + 3. Start guile as a user with write access to the data directory and type + + (use-modules (ice-9 slib)) + + at the Guile prompt. This will generate the slibcat catalog next to + the slib directory. + +SLIB's `require' is provided by the Guile module (ice-9 slib). + +Example: + + (use-modules (ice-9 slib)) + (require 'primes) + (prime? 7) + + +Guile Documentation ================================================== + +If you've never used Scheme before, then the Guile Tutorial +(guile-tut.info) is a good starting point. The Guile Reference Manual +(guile.info) is the primary documentation for Guile. The Goops object +system is documented separately (goops.info). A copy of the R5RS +Scheme specification is included too (r5rs.info). + +Info format versions of this documentation are installed as part of +the normal build process. The texinfo sources are under the doc +directory, and other formats like Postscript, PDF, DVI or HTML can be +generated from them with Tex and Texinfo tools. + +The doc directory also includes an example-smob subdirectory which has +the example code from the "Defining New Types (Smobs)" chapter of the +reference manual. + +The Guile WWW page is at + + http://www.gnu.org/software/guile/guile.html + +It contains a link to the Guile FAQ. + +About This Distribution ============================================== + +Interesting files include: + +- LICENSE, which contains the exact terms of the Guile license. +- COPYING, which contains the terms of the GNU General Public License. +- INSTALL, which contains general instructions for building/installing Guile. +- NEWS, which describes user-visible changes since the last release of Guile. + +Files are usually installed according to the prefix specified to +configure, /usr/local by default. Building and installing gives you: + +Executables, in ${prefix}/bin: + + guile --- a stand-alone interpreter for Guile. With no arguments, this + is a simple interactive Scheme interpreter. It can also be used + as an interpreter for script files; see the NEWS file for details. + guile-config --- a Guile script which provides the information necessary + to link your programs against the Guile library. + guile-snarf --- a script to parse declarations in your C code for + Scheme-visible C functions, Scheme objects to be used by C code, + etc. + +Libraries, in ${prefix}/lib. Depending on the platform and options + given to configure, you may get shared libraries in addition + to or instead of these static libraries: + + libguile.a --- an object library containing the Guile interpreter, + You can use Guile in your own programs by linking against this. + libguilereadline.a --- an object library containing glue code for the + GNU readline library. + + libguile-srfi-*.a --- various SRFI support libraries + +Header files, in ${prefix}/include: + + libguile.h, guile/gh.h, libguile/*.h --- for libguile. + guile-readline/readline.h --- for guile-readline. + +Support files, in ${prefix}/share/guile/: + + ice-9/* --- run-time support for Guile: the module system, + read-eval-print loop, some R4RS code and other infrastructure. + oop/* --- the Guile Object-Oriented Programming System (GOOPS) + scripts/* --- executable modules, i.e., scheme programs that can be both + called as an executable from the shell, and loaded and used as a + module from scheme code. See scripts/README for more info. + srfi/* --- SRFI support modules. See srfi/README for more info. + +Automake macros, in ${prefix}/share/aclocal: + + guile.m4 + +Documentation in Info format, in ${prefix}/info: + + guile --- Guile reference manual. + + guile-tut --- Guile tutorial. + + GOOPS --- GOOPS reference manual. + + r5rs --- Revised(5) Report on the Algorithmic Language Scheme. + + +The Guile source tree is laid out as follows: + +libguile: + The Guile Scheme interpreter --- both the object library + for you to link with your programs, and the executable you can run. +ice-9: Guile's module system, initialization code, and other infrastructure. +guile-config: + Source for the guile-config script. +guile-readline: + The glue code for using GNU readline with Guile. This + will be build when configure can find a recent enough readline + library on your system. +doc: Documentation (see above). + +Git Repository Access ================================================ + +Guile's source code is stored in a Git repository at Savannah. Anyone +can access it using `git-clone' from one of the following URLs: + + git://git.sv.gnu.org/guile.git + http://git.sv.gnu.org/r/guile.git + +Developers with a Savannah SSH account can also access it from: + + ssh://git.sv.gnu.org/srv/git/guile.git + +The repository can also be browsed on-line at the following address: + + http://git.sv.gnu.org/gitweb/?p=guile.git + +For more information on Git, please see: + + http://git.or.cz/ + +Please send problem reports to . diff --git a/guile18/THANKS b/guile18/THANKS new file mode 100644 index 0000000000..48a105aaa9 --- /dev/null +++ b/guile18/THANKS @@ -0,0 +1,121 @@ +Contributors since the last release: + + Rob Browning + Ludovic Courtès + Julian Graham + Stefan Jahn + Neil Jerram + Gregory Marton + Antoine Mathys + Thien-Thi Nguyen + Han-Wen Nienhuys + Jose A Ortega Ruiz + Kevin Ryde + Bill Schottstaedt + Richard Todd + +Sponsors since the last release: + + The Linux Developers Group + +For fixes or providing information which led to a fix: + + David Allouche + Martin Baulig + Fabrice Bauzac + Sylvain Beucler + Carlo Bramini + Rob Browning + Adrian Bunk + Michael Carmack + Stephen Compall + Brian Crowder + Christopher Cramer + David Diffenbaugh + Hyper Division + Alexandre Duret-Lutz + Nils Durner + John W Eaton + Clinton Ebadi + David Fang + Barry Fishman + Charles Gagnon + Peter Gavin + Eric Gillespie, Jr + Didier Godefroy + Panicz Maciej Godek + John Goerzen + Mike Gran + Szavai Gyula + Roland Haeder + Sven Hartrumpf + Eric Hanchrow + Judy Hawkins + Sam Hocevar + Patrick Horgan + Ales Hvezda + Peter Ivanyi + Wolfgang Jaehrling + Aubrey Jaffer + Paul Jarc + Steve Juranich + Richard Kim + Bruce Korb + René Köcher + Matthias Köppe + Matt Kraai + Daniel Kraft + Jay Krell + Jeff Long + Marco Maggi + Gregory Marton + Kjetil S. Matheussen + Antoine Mathys + Dan McMahill + Roger Mc Murtrie + Scott McPeak + Tim Mooney + Han-Wen Nienhuys + Jan Nieuwenhuizen + Hrvoje NikÅ¡ić + Stefan Nordhausen + Roland Orre + Peter O'Gorman + Pieter Pareit + Jack Pavlovsky + Arno Peters + Ron Peterson + David Pirotte + Ken Raeburn + Andreas Rottmann + Hugh Sasse + Werner Scheinast + Bill Schottstaedt + Frank Schwidom + Thiemo Seufer + Scott Shedden + Alex Shinn + Daniel Skarda + Cesar Strauss + Rainer Tammer + Richard Todd + Issac Trotts + Greg Troxel + Aaron M. Ucko + Stephen Uitti + Momchil Velikov + Linas Vepstas + Panagiotis Vossos + Neil W. Van Dyke + Aaron VanDevender + Andreas Vögele + Michael Talbot-Wilson + Michael Tuexen + Jon Wilson + Andy Wingo + Keith Wright + + +;; Local Variables: +;; coding: utf-8 +;; End: diff --git a/guile18/acinclude.m4 b/guile18/acinclude.m4 new file mode 100644 index 0000000000..345e323b36 --- /dev/null +++ b/guile18/acinclude.m4 @@ -0,0 +1,310 @@ +dnl On the NeXT, #including doesn't give you a definition for +dnl struct utime, unless you #define _POSIX_SOURCE. + +AC_DEFUN([GUILE_STRUCT_UTIMBUF], [ + AC_CACHE_CHECK([whether we need POSIX to get struct utimbuf], + guile_cv_struct_utimbuf_needs_posix, + [AC_TRY_CPP([ +#ifdef __EMX__ +#include +#else +#include +#endif +struct utime blah; +], + guile_cv_struct_utimbuf_needs_posix=no, + guile_cv_struct_utimbuf_needs_posix=yes)]) + if test "$guile_cv_struct_utimbuf_needs_posix" = yes; then + AC_DEFINE([UTIMBUF_NEEDS_POSIX], 1, + [Define this if doesn't define struct utimbuf unless + _POSIX_SOURCE is defined. See GUILE_STRUCT_UTIMBUF in aclocal.m4.]) + fi]) + + + + +dnl +dnl Apparently, at CMU they have a weird version of libc.h that is +dnl installed in /usr/local/include and conflicts with unistd.h. +dnl In these situations, we should not #include libc.h. +dnl This test arranges to #define LIBC_H_WITH_UNISTD_H iff libc.h is +dnl present on the system, and is safe to #include. +dnl +AC_DEFUN([GUILE_HEADER_LIBC_WITH_UNISTD], + [ + AC_CHECK_HEADERS(libc.h unistd.h) + AC_CACHE_CHECK( + [whether libc.h and unistd.h can be included together], + guile_cv_header_libc_with_unistd, + [ + if test "$ac_cv_header_libc_h" = "no"; then + guile_cv_header_libc_with_unistd="no" + elif test "$ac_cv_header_unistd_h" = "no"; then + guile_cv_header_libc_with_unistd="yes" + else + AC_TRY_COMPILE( + [ +# include +# include + ], + [], + [guile_cv_header_libc_with_unistd=yes], + [guile_cv_header_libc_with_unistd=no] + ) + fi + ] + ) + if test "$guile_cv_header_libc_with_unistd" = yes; then + AC_DEFINE(LIBC_H_WITH_UNISTD_H, 1, + [Define this if we should include when we've already + included . On some systems, they conflict, and libc.h + should be omitted. See GUILE_HEADER_LIBC_WITH_UNISTD in + aclocal.m4.]) + fi + ] +) + + + +dnl This is needed when we want to check for the same function repeatedly +dnl with other parameters, such as libraries, varying. +dnl +dnl GUILE_NAMED_CHECK_FUNC(FUNCTION, TESTNAME, +dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +AC_DEFUN([GUILE_NAMED_CHECK_FUNC], +[AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(ac_cv_func_$1_$2, +[AC_TRY_LINK( +dnl Don't include because on OSF/1 3.0 it includes +dnl which includes which contains a prototype for +dnl select. Similarly for bzero. +[/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $1(); below. */ +#include +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $1(); +], [ +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$1) || defined (__stub___$1) +choke me +#else +$1(); +#endif +], eval "ac_cv_func_$1_$2=yes", eval "ac_cv_func_$1_$2=no")]) +if eval "test \"`echo '$ac_cv_func_'$1'_'$2`\" = yes"; then + AC_MSG_RESULT(yes) + ifelse([$3], , :, [$3]) +else + AC_MSG_RESULT(no) +ifelse([$4], , , [$4 +])dnl +fi +]) + + + + +dnl Available from the Autoconf Macro Archive at: +dnl http://autoconf-archive.cryp.to/acx_pthread.html +dnl +AC_DEFUN([ACX_PTHREAD], [ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_LANG_SAVE +AC_LANG_C +acx_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) + AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) + AC_MSG_RESULT($acx_pthread_ok) + if test x"$acx_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# ... -mt is also the pthreads flag for HP/aCC +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case "${host_cpu}-${host_os}" in + *solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthreads/-mt/ + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" + ;; +esac + +if test x"$acx_pthread_ok" = xno; then +for flag in $acx_pthread_flags; do + + case $flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $flag]) + PTHREAD_CFLAGS="$flag" + ;; + + pthread-config) + AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) + if test x"$acx_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$flag]) + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [acx_pthread_ok=yes]) + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + AC_MSG_RESULT($acx_pthread_ok) + if test "x$acx_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$acx_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + AC_MSG_CHECKING([for joinable pthread attribute]) + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_TRY_LINK([#include ], [int attr=$attr; return attr;], + [attr_name=$attr; break]) + done + AC_MSG_RESULT($attr_name) + if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + fi + + AC_MSG_CHECKING([if more special flags are required for pthreads]) + flag=no + case "${host_cpu}-${host_os}" in + *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; + *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; + esac + AC_MSG_RESULT(${flag}) + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + # More AIX lossage: must compile with xlc_r or cc_r + if test x"$GCC" != xyes; then + AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) + else + PTHREAD_CC=$CC + fi +else + PTHREAD_CC="$CC" +fi + +AC_SUBST(PTHREAD_LIBS) +AC_SUBST(PTHREAD_CFLAGS) +AC_SUBST(PTHREAD_CC) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$acx_pthread_ok" = xyes; then + ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) + : +else + acx_pthread_ok=no + $2 +fi +AC_LANG_RESTORE +])dnl ACX_PTHREAD diff --git a/guile18/am/ChangeLog-2008 b/guile18/am/ChangeLog-2008 new file mode 100644 index 0000000000..3b0cdcdb8b --- /dev/null +++ b/guile18/am/ChangeLog-2008 @@ -0,0 +1,18 @@ +2002-04-10 Rob Browning + + * .cvsignore: add Makefile and Makefile.in. + +2002-04-01 Thien-Thi Nguyen + + * maintainer-dirs: Remove "if MAINTAINER_MODE" conditional. + +2002-03-30 Thien-Thi Nguyen + + * maintainer-dirs: New file. + + * Makefile.am (am_frags): Add "maintainer-dirs". + +2002-02-26 Thien-Thi Nguyen + + * pre-inst-guile, Makefile.am, README: New files. + diff --git a/guile18/am/Makefile.am b/guile18/am/Makefile.am new file mode 100644 index 0000000000..8b49c2bcae --- /dev/null +++ b/guile18/am/Makefile.am @@ -0,0 +1,28 @@ +## Process this file with Automake to create Makefile.in +## +## Copyright (C) 2002, 2006, 2008 Free Software Foundation, Inc. +## +## This file is part of GUILE. +## +## GUILE is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as +## published by the Free Software Foundation; either version 2, or +## (at your option) any later version. +## +## GUILE is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public +## License along with GUILE; see the file COPYING. If not, write +## to the Free Software Foundation, Inc., 51 Franklin Street, Fifth +## Floor, Boston, MA 02110-1301 USA + +AUTOMAKE_OPTIONS = gnu + +am_frags = pre-inst-guile maintainer-dirs + +EXTRA_DIST = $(am_frags) ChangeLog-2008 + +## Makefile.am ends here diff --git a/guile18/am/README b/guile18/am/README new file mode 100644 index 0000000000..c7883c37ce --- /dev/null +++ b/guile18/am/README @@ -0,0 +1,3 @@ +data directory: automake frags + +do not name files using extension ".am", as automake is overzealous sometimes. diff --git a/guile18/am/maintainer-dirs b/guile18/am/maintainer-dirs new file mode 100644 index 0000000000..c64268de96 --- /dev/null +++ b/guile18/am/maintainer-dirs @@ -0,0 +1,34 @@ +## am/maintainer-dirs --- define workbook and mscripts vars + +## Copyright (C) 2002, 2006 Free Software Foundation +## +## This file is part of GUILE. +## +## GUILE is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as +## published by the Free Software Foundation; either version 2, or +## (at your option) any later version. +## +## GUILE is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public +## License along with GUILE; see the file COPYING. If not, write +## to the Free Software Foundation, Inc., 51 Franklin Street, Fifth +## Floor, Boston, MA 02110-1301 USA + +## Commentary: + +## This fragment defines two variables: workbook and mscripts. +## It can be included in any Makefile.am by adding the line: +## include $(top_srcdir)/am/maintainer-dirs +## See $(workbook)/build/maintainer-dirs.text for more info. + +## Code: + +workbook = $(top_srcdir_absolute)/../workbook +mscripts = $(top_srcdir_absolute)/../scripts + +## am/maintainer-dirs ends here diff --git a/guile18/am/pre-inst-guile b/guile18/am/pre-inst-guile new file mode 100644 index 0000000000..c1a7407c9f --- /dev/null +++ b/guile18/am/pre-inst-guile @@ -0,0 +1,34 @@ +## am/pre-inst-guile --- define preinstguile and preinstguiletool vars + +## Copyright (C) 2002, 2006 Free Software Foundation +## +## This file is part of GUILE. +## +## GUILE is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as +## published by the Free Software Foundation; either version 2, or +## (at your option) any later version. +## +## GUILE is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public +## License along with GUILE; see the file COPYING. If not, write +## to the Free Software Foundation, Inc., 51 Franklin Street, Fifth +## Floor, Boston, MA 02110-1301 USA + +## Commentary: + +## This fragment defines two variables: preinstguile, preinstguiletool. +## It can be included in any Makefile.am by adding the line: +## include $(top_srcdir)/am/pre-inst-guile +## See devel/build/pre-inst-guile.text (CVS only) for more info. + +## Code: + +preinstguile = $(top_builddir_absolute)/pre-inst-guile +preinstguiletool = GUILE="$(preinstguile)" $(top_srcdir)/scripts + +## am/pre-inst-guile ends here diff --git a/guile18/autogen.sh b/guile18/autogen.sh new file mode 100755 index 0000000000..fa34047f8d --- /dev/null +++ b/guile18/autogen.sh @@ -0,0 +1,16 @@ +#!/bin/sh +# Usage: sh -x ./autogen.sh + +set -e + +[ -f GUILE-VERSION ] || { + echo "autogen.sh: run this command only at the top of guile-core." + exit 1 +} + +###################################################################### +### update infrastructure + +autoreconf -i --force --verbose + +echo "Now run configure and make." diff --git a/guile18/benchmark-guile.in b/guile18/benchmark-guile.in new file mode 100644 index 0000000000..af1ade6160 --- /dev/null +++ b/guile18/benchmark-guile.in @@ -0,0 +1,48 @@ +#! /bin/sh +# Usage: benchmark-guile [-i GUILE-INTERPRETER] [GUILE-BENCHMARK-ARGS] +# If `-i GUILE-INTERPRETER' is omitted, use ${top_builddir}/pre-inst-guile. +# See ${top_srcdir}/benchmark-suite/guile-benchmark for documentation on GUILE-BENCHMARK-ARGS. +# +# Example invocations: +# ./benchmark-guile +# ./benchmark-guile numbers.bm +# ./benchmark-guile -i /usr/local/bin/guile +# ./benchmark-guile -i /usr/local/bin/guile numbers.bm + +set -e + +top_builddir=@top_builddir_absolute@ +top_srcdir=@top_srcdir_absolute@ + +BENCHMARK_SUITE_DIR=${top_srcdir}/benchmark-suite + +if [ x"$1" = x-i ] ; then + guile=$2 + shift + shift +else + guile=${top_builddir}/pre-inst-guile +fi + +GUILE_LOAD_PATH=$BENCHMARK_SUITE_DIR +export GUILE_LOAD_PATH + +if [ -f "$guile" -a -x "$guile" ] ; then + echo Benchmarking $guile ... "$@" + echo with GUILE_LOAD_PATH=$GUILE_LOAD_PATH +else + echo ERROR: Cannot execute $guile + exit 1 +fi + +# documentation searching ignores GUILE_LOAD_PATH. +if [ ! -f guile-procedures.txt ] ; then + @LN_S@ libguile/guile-procedures.txt . +fi + +exec $guile \ + -e main -s "$BENCHMARK_SUITE_DIR/guile-benchmark" \ + --benchmark-suite "$BENCHMARK_SUITE_DIR/benchmarks" \ + --log-file benchmark-guile.log "$@" + +# benchmark-guile ends here diff --git a/guile18/benchmark-suite/ChangeLog-2008 b/guile18/benchmark-suite/ChangeLog-2008 new file mode 100644 index 0000000000..0d79710f6f --- /dev/null +++ b/guile18/benchmark-suite/ChangeLog-2008 @@ -0,0 +1,85 @@ +2008-04-17 Ludovic Courtès + + * Makefile.am (SCM_BENCHMARKS): Add `benchmarks/read.bm'. + * benchmarks/read.bm: New file. + +2008-01-22 Neil Jerram + + * COPYING: Removed. + +2006-05-02 Marius Vollmer + + * Makefile.am (SCM_BENCHMARKS_DIRS, dist-hook): Removed, they are + no longer needed and lead to unclean tarballs. + +2004-01-23 Dirk Herrmann + + * lib.scm: Extracted '/i' to toplevel. Print the guile version + number before the benchmarks are run. Print the framework-time + per iteration as an inexact number. + +2004-01-06 Marius Vollmer + + * lib.scm (print-result, print-user-result): Handle exact + fractions. + +2003-05-27 Dirk Herrmann + + * lib.scm: Fix some typos in the documentation. + +2002-09-14 Rob Browning + + * .cvsignore: new file. + +2002-07-26 Marius Vollmer + + * Makefile.am (SCM_BENCHMARKS): List the real benchmarks, not foo + and bar. + (SCM_BENCHMARKS_DIRS): Uncommented, with an empty value. + (dist-hook): Use quotes so that an empty SCM_BENCHMARKS_DIRS works. + +2002-07-21 Dirk Herrmann + + * lib.scm (print-result, print-user-result): Changed the + reporter's outputs to use symbols rather than strings to document + the individual values. Thanks to Neil Jerram for the suggestion. + +2002-07-21 Dirk Herrmann + + * benchmarks/0-reference.bm: Added as a reference benchmark to be + used to calibrate iteration counts. + + * lib.scm: Added documentation. Added some initialization + messages. + + (benchmark-time-base, benchmark-total-time, benchmark-user-time, + benchmark-system-time, benchmark-frame-time, benchmark-core-time, + benchmark-user-time\interpreter, benchmark-core-time\interpreter): + Exported. + + (benchmark-time-base, time-base): Renamed time-base to + benchmark-time-base and introduced new time-base as a short-cut. + + (total-time, benchmark-total-time, user-time, benchmark-user-time, + system-time, benchmark-system-time, frame-time, + benchmark-frame-time, benchmark-time, benchmark-core-time, + user-time\interpreter, benchmark-user-time\interpreter, + benchmark-time\interpreter, benchmark-core-time\interpreter, + print-result, print-user-result): Renamed -time to + benchmark--time. Exceptions: benchmark-time and + benchmark-time\interpreter were renamed to benchmark-core-time and + benchmark-core-time\interpreter, respectively. + +2002-07-20 Dirk Herrmann + + * COPYING, README, Makefile.am, lib.scm, guile-benchmark: Copied + from the test-suite directory, renamed and adapted for use with + benchmarks. + + * benchmarks/logand.bm, benchmarks/continuations.bm, + benchmarks/if.bm: Added as initial fairly stupid examples for + benchmarks. + +2002-07-20 Dirk Herrmann + + * Log begins. diff --git a/guile18/benchmark-suite/Makefile.am b/guile18/benchmark-suite/Makefile.am new file mode 100644 index 0000000000..e65e8bcb24 --- /dev/null +++ b/guile18/benchmark-suite/Makefile.am @@ -0,0 +1,10 @@ +SCM_BENCHMARKS = benchmarks/0-reference.bm \ + benchmarks/continuations.bm \ + benchmarks/if.bm \ + benchmarks/logand.bm \ + benchmarks/read.bm \ + benchmarks/subr.bm \ + benchmarks/uniform-vector-read.bm + +EXTRA_DIST = guile-benchmark lib.scm $(SCM_BENCHMARKS) \ + ChangeLog-2008 diff --git a/guile18/benchmark-suite/README b/guile18/benchmark-suite/README new file mode 100644 index 0000000000..186a743514 --- /dev/null +++ b/guile18/benchmark-suite/README @@ -0,0 +1,18 @@ +This directory contains some benchmarks for Guile, and some generic +benchmarking support code. + +To run these benchmarks, you will need a version of Guile more recent +than 15 Feb 1999 --- the benchmarks use the (ice-9 and-let*) and +(ice-9 getopt-long) modules, which were added to Guile around then. + +For information about how to run the benchmark suite, read the usage +instructions in the comments at the top of the guile-benchmark script. + +You can reference the file `lib.scm' from your own code as the module +(benchmark-suite lib); it also has comments at the top and before each +function explaining what's going on. + +Please write more Guile benchmarks, and send them to bug-guile@gnu.org. +We'll merge them into the distribution. All benchmark suites must be +licensed for our use under the GPL, but I don't think we're going to +collect assignment papers for them. diff --git a/guile18/benchmark-suite/benchmarks/0-reference.bm b/guile18/benchmark-suite/benchmarks/0-reference.bm new file mode 100644 index 0000000000..65085a8d7b --- /dev/null +++ b/guile18/benchmark-suite/benchmarks/0-reference.bm @@ -0,0 +1,2 @@ +(benchmark "reference benchmark for iteration counts" 330000 + #t) diff --git a/guile18/benchmark-suite/benchmarks/continuations.bm b/guile18/benchmark-suite/benchmarks/continuations.bm new file mode 100644 index 0000000000..7c44300f70 --- /dev/null +++ b/guile18/benchmark-suite/benchmarks/continuations.bm @@ -0,0 +1,5 @@ +(define (callee continuation) + (continuation #t)) + +(benchmark "call/cc" 300 + (call-with-current-continuation callee)) diff --git a/guile18/benchmark-suite/benchmarks/if.bm b/guile18/benchmark-suite/benchmarks/if.bm new file mode 100644 index 0000000000..30c22c9c37 --- /dev/null +++ b/guile18/benchmark-suite/benchmarks/if.bm @@ -0,0 +1,51 @@ +(with-benchmark-prefix "if--then-else" + + (benchmark "executing then" 330000 + (if (quote #t) #t #f)) + + (benchmark "executing else" 330000 + (if (quote #f) #t #f))) + +(with-benchmark-prefix "if--then" + + (benchmark "executing then" 330000 + (if (quote #t) #t)) + + (benchmark "executing else" 330000 + (if (quote #f) #t))) + +(with-benchmark-prefix "if--then-else" + + (let ((x #t)) + (benchmark "executing then" 330000 + (if x #t #f))) + + (let ((x #f)) + (benchmark "executing else" 330000 + (if x #t #f)))) + +(with-benchmark-prefix "if--then" + + (let ((x #t)) + (benchmark "executing then" 330000 + (if x #t))) + + (let ((x #f)) + (benchmark "executing else" 330000 + (if x #t)))) + +(with-benchmark-prefix "if--then-else" + + (benchmark "executing then" 330000 + (if #t #t #f)) + + (benchmark "executing else" 330000 + (if #f #t #f))) + +(with-benchmark-prefix "if--then" + + (benchmark "executing then" 330000 + (if #t #t)) + + (benchmark "executing else" 330000 + (if #f #t))) diff --git a/guile18/benchmark-suite/benchmarks/logand.bm b/guile18/benchmark-suite/benchmarks/logand.bm new file mode 100644 index 0000000000..cdb05e88d5 --- /dev/null +++ b/guile18/benchmark-suite/benchmarks/logand.bm @@ -0,0 +1,6 @@ +(define bignum (1- (expt 2 128))) + +(let* ((i 0)) + (benchmark "bignum" 130000 + (logand i bignum) + (set! i (+ i 1)))) diff --git a/guile18/benchmark-suite/benchmarks/read.bm b/guile18/benchmark-suite/benchmarks/read.bm new file mode 100644 index 0000000000..cb876b5ad6 --- /dev/null +++ b/guile18/benchmark-suite/benchmarks/read.bm @@ -0,0 +1,62 @@ +;;; read.bm --- Exercise the reader. -*- Scheme -*- +;;; +;;; Copyright (C) 2008 Free Software Foundation, Inc. +;;; +;;; This program is free software; you can redistribute it and/or modify +;;; it under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 2, or (at your option) +;;; any later version. +;;; +;;; This program is distributed in the hope that it will be useful, +;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with this software; see the file COPYING. If not, write to +;;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;;; Boston, MA 02110-1301 USA + +(define-module (benchmarks read) + :use-module (benchmark-suite lib)) + + +(define %files-to-load + ;; Various large Scheme files. + (map %search-load-path + '("ice-9/boot-9.scm" "ice-9/common-list.scm" + "ice-9/format.scm" "ice-9/optargs.scm" + "ice-9/session.scm" "ice-9/getopt-long.scm" + "ice-9/psyntax.pp"))) + +(define (load-file-with-reader file-name reader buffering) + (with-input-from-file file-name + (lambda () + (apply setvbuf (current-input-port) buffering) + (let loop ((sexp (reader))) + (if (eof-object? sexp) + #t + (loop (reader))))))) + +(define (exercise-read buffering) + (for-each (lambda (file) + (load-file-with-reader file read buffering)) + %files-to-load)) + + +(with-benchmark-prefix "read" + + (benchmark "_IONBF" 5 ;; this one is very slow + (exercise-read (list _IONBF))) + + (benchmark "_IOLBF" 100 + (exercise-read (list _IOLBF))) + + (benchmark "_IOFBF 4096" 100 + (exercise-read (list _IOFBF 4096))) + + (benchmark "_IOFBF 8192" 100 + (exercise-read (list _IOFBF 8192))) + + (benchmark "_IOFBF 16384" 100 + (exercise-read (list _IOFBF 16384)))) diff --git a/guile18/benchmark-suite/benchmarks/subr.bm b/guile18/benchmark-suite/benchmarks/subr.bm new file mode 100644 index 0000000000..9c87a99219 --- /dev/null +++ b/guile18/benchmark-suite/benchmarks/subr.bm @@ -0,0 +1,66 @@ +;;; subr.bm --- Measure the subr invocation cost. -*- Scheme -*- +;;; +;;; Copyright (C) 2009 Free Software Foundation, Inc. +;;; +;;; This program is free software; you can redistribute it and/or modify +;;; it under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 2, or (at your option) +;;; any later version. +;;; +;;; This program is distributed in the hope that it will be useful, +;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with this software; see the file COPYING. If not, write to +;;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;;; Boston, MA 02110-1301 USA + +(define-module (benchmarks subrs) + :use-module (benchmark-suite lib)) + + +(define hook1 (make-hook 1)) +(define hook3 (make-hook 3)) + +(with-benchmark-prefix "subr invocation" + + (benchmark "simple subr" 700000 + ;; 1 required argument, 0 optional arguments, no rest. + (1+ 0)) + + (benchmark "generic subr" 700000 + ;; 2 required arguments, 4 optional arguments, no rest. + + ;; In Guile 1.8 and earlier, such subrs are implemented as "compiled + ;; closures" (cclos). There, when a cclo/gsubr is called, the evaluator + ;; goes through `SCM_APPLY ()' and conses the arguments, which is more + ;; costly than the invocation of a "simple subr". + (string= "foo" "bar")) + + (benchmark "generic subr with rest arg" 700000 + ;; 1 required argument, 0 optional arguments, 1 rest. + (run-hook hook1 1)) + + (benchmark "generic subr with rest arg and 3+ parameters" 700000 + ;; 1 required argument, 0 optional arguments, 1 rest. + + ;; The evaluator considers calls with 3 and more parameters as a general + ;; form and always stores the arguments into a list. + (run-hook hook3 1 2 3))) + + +(with-benchmark-prefix "subr application" + + (benchmark "simple subr" 700000 + (apply 1+ '(0))) + + (benchmark "generic subr" 700000 + (apply string= "foo" '("bar"))) + + (benchmark "generic subr with rest arg" 700000 + (apply run-hook hook1 '(1))) + + (benchmark "generic subr with rest arg and 3+ parameters" 700000 + (run-hook hook3 1 2 '(3)))) diff --git a/guile18/benchmark-suite/benchmarks/uniform-vector-read.bm b/guile18/benchmark-suite/benchmarks/uniform-vector-read.bm new file mode 100644 index 0000000000..d288f0b449 --- /dev/null +++ b/guile18/benchmark-suite/benchmarks/uniform-vector-read.bm @@ -0,0 +1,53 @@ +;;; uniform-vector-read.bm --- Exercise binary I/O primitives. -*- Scheme -*- +;;; +;;; Copyright (C) 2008 Free Software Foundation, Inc. +;;; +;;; This program is free software; you can redistribute it and/or modify +;;; it under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 2, or (at your option) +;;; any later version. +;;; +;;; This program is distributed in the hope that it will be useful, +;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with this software; see the file COPYING. If not, write to +;;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;;; Boston, MA 02110-1301 USA + +(define-module (benchmarks uniform-vector-read) + :use-module (benchmark-suite lib) + :use-module (srfi srfi-4)) + +(define file-name + (tmpnam)) + +(define %buffer-size + 7777) + +(define buf + (make-u8vector %buffer-size)) + +(define str + (make-string %buffer-size)) + + +(with-benchmark-prefix "uniform-vector-read!" + + (benchmark "uniform-vector-write" 500 + (let ((output (open-output-file file-name))) + (uniform-vector-write buf output) + (close output))) + + (benchmark "uniform-vector-read!" 500 + (let ((input (open-input-file file-name))) + (setvbuf input _IONBF) + (uniform-vector-read! buf input) + (close input))) + + (benchmark "string port" 5000 + (let ((input (open-input-string str))) + (uniform-vector-read! buf input) + (close input)))) diff --git a/guile18/benchmark-suite/guile-benchmark b/guile18/benchmark-suite/guile-benchmark new file mode 100755 index 0000000000..c4c6f23de4 --- /dev/null +++ b/guile18/benchmark-suite/guile-benchmark @@ -0,0 +1,220 @@ +#!../libguile/guile \ +-e main -s +!# + +;;;; guile-benchmark --- run the Guile benchmark suite +;;;; Adapted from code by Jim Blandy --- May 1999 +;;;; +;;;; Copyright (C) 2002, 2006 Free Software Foundation, Inc. +;;;; +;;;; This program is free software; you can redistribute it and/or modify +;;;; it under the terms of the GNU General Public License as published by +;;;; the Free Software Foundation; either version 2, or (at your option) +;;;; any later version. +;;;; +;;;; This program is distributed in the hope that it will be useful, +;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;;; GNU General Public License for more details. +;;;; +;;;; You should have received a copy of the GNU General Public License +;;;; along with this software; see the file COPYING. If not, write to +;;;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;;;; Boston, MA 02110-1301 USA + + +;;;; Usage: [guile -e main -s] guile-benchmark [OPTIONS] [BENCHMARK ...] +;;;; +;;;; Run benchmarks from the Guile benchmark suite. Report timing +;;;; results to the standard output, along with a summary of all +;;;; the results. Record each reported benchmark outcome in the log +;;;; file, `benchmarks.log'. +;;;; +;;;; Normally, guile-benchmark scans the benchmark directory, and +;;;; executes all files whose names end in `.bm'. (It assumes they contain +;;;; Scheme code.) However, you can have it execute specific benchmarks by +;;;; listing their filenames on the command line. +;;;; +;;;; The option `--benchmark-suite' can be given to specify the benchmark +;;;; directory. If no such option is given, the benchmark directory is +;;;; taken from the environment variable BENCHMARK_SUITE_DIR (if defined), +;;;; otherwise a default directory that is hardcoded in this file is +;;;; used (see "Installation" below). +;;;; +;;;; If present, the `--iteration-factor FACTOR' option tells +;;;; `guile-benchmark' to multiply the number of iterations given with +;;;; each single benchmark by the value of FACTOR. This allows to +;;;; reduce or increase the total time for benchmarking. +;;;; +;;;; If present, the `--log-file LOG' option tells `guile-benchmark' to put +;;;; the log output in a file named LOG. +;;;; +;;;; If present, the `--debug' option will enable a debugging mode. +;;;; +;;;; +;;;; Installation: +;;;; +;;;; If you change the #! line at the top of this script to point at +;;;; the Guile interpreter you want to run, you can call this script +;;;; as an executable instead of having to pass it as a parameter to +;;;; guile via "guile -e main -s guile-benchmark". Further, you can edit +;;;; the definition of default-benchmark-suite to point to the parent +;;;; directory of the `benchmarks' tree, which makes it unnecessary to set +;;;; the environment variable `BENCHMARK_SUITE_DIR'. +;;;; +;;;; +;;;; Shortcomings: +;;;; +;;;; At the moment, due to a simple-minded implementation, benchmark files +;;;; must live in the benchmark directory, and you must specify their names +;;;; relative to the top of the benchmark directory. If you want to send +;;;; me a patch that fixes this, but still leaves sane benchmark names in +;;;; the log file, that would be great. At the moment, all the benchmarks +;;;; I care about are in the benchmark directory, though. +;;;; +;;;; It would be nice if you could specify the Guile interpreter you +;;;; want to benchmark on the command line. As it stands, if you want to +;;;; change which Guile interpreter you're benchmarking, you need to edit +;;;; the #! line at the top of this file, which is stupid. + + +;;; User configurable settings: +(define default-benchmark-suite + (string-append (getenv "HOME") "/bogus-path/benchmark-suite")) + + +(use-modules (benchmark-suite lib) + (ice-9 getopt-long) + (ice-9 and-let-star) + (ice-9 rdelim)) + + +;;; Variables that will receive their actual values later. +(define benchmark-suite default-benchmark-suite) + +(define tmp-dir #f) + + +;;; General utilities, that probably should be in a library somewhere. + +;;; Enable debugging +(define (enable-debug-mode) + (write-line %load-path) + (set! %load-verbosely #t) + (debug-enable 'backtrace 'debug)) + +;;; Traverse the directory tree at ROOT, applying F to the name of +;;; each file in the tree, including ROOT itself. For a subdirectory +;;; SUB, if (F SUB) is true, we recurse into SUB. Do not follow +;;; symlinks. +(define (for-each-file f root) + + ;; A "hard directory" is a path that denotes a directory and is not a + ;; symlink. + (define (file-is-hard-directory? filename) + (eq? (stat:type (lstat filename)) 'directory)) + + (let visit ((root root)) + (let ((should-recur (f root))) + (if (and should-recur (file-is-hard-directory? root)) + (let ((dir (opendir root))) + (let loop () + (let ((entry (readdir dir))) + (cond + ((eof-object? entry) #f) + ((or (string=? entry ".") + (string=? entry "..") + (string=? entry "CVS") + (string=? entry "RCS")) + (loop)) + (else + (visit (string-append root "/" entry)) + (loop)))))))))) + + +;;; The benchmark driver. + + +;;; Localizing benchmark files and temporary data files. + +(define (data-file-name filename) + (in-vicinity tmp-dir filename)) + +(define (benchmark-file-name benchmark) + (in-vicinity benchmark-suite benchmark)) + +;;; Return a list of all the benchmark files in the benchmark tree. +(define (enumerate-benchmarks benchmark-dir) + (let ((root-len (+ 1 (string-length benchmark-dir))) + (benchmarks '())) + (for-each-file (lambda (file) + (if (has-suffix? file ".bm") + (let ((short-name + (substring file root-len))) + (set! benchmarks (cons short-name benchmarks)))) + #t) + benchmark-dir) + + ;; for-each-file presents the files in whatever order it finds + ;; them in the directory. We sort them here, so they'll always + ;; appear in the same order. This makes it easier to compare benchmark + ;; log files mechanically. + (sort benchmarks stringnumber (opt 'iteration-factor "1"))) + + ;; directory where temporary files are created. + (set! tmp-dir (getcwd)) + + (let* ((benchmarks + (let ((foo (opt '() '()))) + (if (null? foo) + (enumerate-benchmarks benchmark-suite) + foo))) + (log-file + (opt 'log-file "benchmarks.log"))) + + ;; Open the log file. + (let ((log-port (open-output-file log-file))) + + ;; Register some reporters. + (register-reporter (make-log-reporter log-port)) + (register-reporter user-reporter) + + ;; Run the benchmarks. + (for-each (lambda (benchmark) + (with-benchmark-prefix benchmark + (load (benchmark-file-name benchmark)))) + benchmarks) + (close-port log-port))))) + + +;;; Local Variables: +;;; mode: scheme +;;; End: diff --git a/guile18/benchmark-suite/lib.scm b/guile18/benchmark-suite/lib.scm new file mode 100644 index 0000000000..65491d735f --- /dev/null +++ b/guile18/benchmark-suite/lib.scm @@ -0,0 +1,530 @@ +;;;; benchmark-suite/lib.scm --- generic support for benchmarking +;;;; Copyright (C) 2002, 2006 Free Software Foundation, Inc. +;;;; +;;;; This program is free software; you can redistribute it and/or modify +;;;; it under the terms of the GNU General Public License as published by +;;;; the Free Software Foundation; either version 2, or (at your option) +;;;; any later version. +;;;; +;;;; This program is distributed in the hope that it will be useful, +;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;;; GNU General Public License for more details. +;;;; +;;;; You should have received a copy of the GNU General Public License +;;;; along with this software; see the file COPYING. If not, write to +;;;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;;;; Boston, MA 02110-1301 USA + +(define-module (benchmark-suite lib) + :export ( + + ;; Controlling the execution. + iteration-factor + scale-iterations + + ;; Running benchmarks. + run-benchmark + benchmark + + ;; Naming groups of benchmarks in a regular fashion. + with-benchmark-prefix with-benchmark-prefix* current-benchmark-prefix + format-benchmark-name + + ;; Computing timing results + benchmark-time-base + benchmark-total-time benchmark-user-time benchmark-system-time + benchmark-frame-time benchmark-core-time + benchmark-user-time\interpreter benchmark-core-time\interpreter + + ;; Reporting results in various ways. + register-reporter unregister-reporter reporter-registered? + make-log-reporter + full-reporter + user-reporter)) + + +;;;; If you're using Emacs's Scheme mode: +;;;; (put 'with-benchmark-prefix 'scheme-indent-function 1) +;;;; (put 'benchmark 'scheme-indent-function 1) + + +;;;; CORE FUNCTIONS +;;;; +;;;; The function (run-benchmark name iterations thunk) is the heart of the +;;;; benchmarking environment. The first parameter NAME is a unique name for +;;;; the benchmark to be executed (for an explanation of this parameter see +;;;; below under ;;;; NAMES. The second parameter ITERATIONS is a positive +;;;; integer value that indicates how often the thunk shall be executed (for +;;;; an explanation of how iteration counts should be used, see below under +;;;; ;;;; ITERATION COUNTS). For example: +;;;; +;;;; (run-benchmark "small integer addition" 100000 (lambda () (+ 1 1))) +;;;; +;;;; This will run the function (lambda () (+ 1 1)) a 100000 times (the +;;;; iteration count can, however be scaled. See below for details). Some +;;;; different time data for running the thunk for the given number of +;;;; iterations is measured and reported. +;;;; +;;;; Convenience macro +;;;; +;;;; * (benchmark name iterations body) is a short form for +;;;; (run-benchmark name iterations (lambda () body)) + + +;;;; NAMES +;;;; +;;;; Every benchmark in the benchmark suite has a unique name to be able to +;;;; compare the results of individual benchmarks across several runs of the +;;;; benchmark suite. +;;;; +;;;; A benchmark name is a list of printable objects. For example: +;;;; ("ports.scm" "file" "read and write back list of strings") +;;;; ("ports.scm" "pipe" "read") +;;;; +;;;; Benchmark names may contain arbitrary objects, but they always have +;;;; the following properties: +;;;; - Benchmark names can be compared with EQUAL?. +;;;; - Benchmark names can be reliably stored and retrieved with the standard +;;;; WRITE and READ procedures; doing so preserves their identity. +;;;; +;;;; For example: +;;;; +;;;; (benchmark "simple addition" 100000 (+ 2 2)) +;;;; +;;;; In that case, the benchmark name is the list ("simple addition"). +;;;; +;;;; The WITH-BENCHMARK-PREFIX syntax and WITH-BENCHMARK-PREFIX* procedure +;;;; establish a prefix for the names of all benchmarks whose results are +;;;; reported within their dynamic scope. For example: +;;;; +;;;; (begin +;;;; (with-benchmark-prefix "basic arithmetic" +;;;; (benchmark "addition" 100000 (+ 2 2)) +;;;; (benchmark "subtraction" 100000 (- 4 2))) +;;;; (benchmark "multiplication" 100000 (* 2 2)))) +;;;; +;;;; In that example, the three benchmark names are: +;;;; ("basic arithmetic" "addition"), +;;;; ("basic arithmetic" "subtraction"), and +;;;; ("multiplication"). +;;;; +;;;; WITH-BENCHMARK-PREFIX can be nested. Each WITH-BENCHMARK-PREFIX +;;;; postpends a new element to the current prefix: +;;;; +;;;; (with-benchmark-prefix "arithmetic" +;;;; (with-benchmark-prefix "addition" +;;;; (benchmark "integer" 100000 (+ 2 2)) +;;;; (benchmark "complex" 100000 (+ 2+3i 4+5i))) +;;;; (with-benchmark-prefix "subtraction" +;;;; (benchmark "integer" 100000 (- 2 2)) +;;;; (benchmark "complex" 100000 (- 2+3i 1+2i)))) +;;;; +;;;; The four benchmark names here are: +;;;; ("arithmetic" "addition" "integer") +;;;; ("arithmetic" "addition" "complex") +;;;; ("arithmetic" "subtraction" "integer") +;;;; ("arithmetic" "subtraction" "complex") +;;;; +;;;; To print a name for a human reader, we DISPLAY its elements, +;;;; separated by ": ". So, the last set of benchmark names would be +;;;; reported as: +;;;; +;;;; arithmetic: addition: integer +;;;; arithmetic: addition: complex +;;;; arithmetic: subtraction: integer +;;;; arithmetic: subtraction: complex +;;;; +;;;; The Guile benchmarks use with-benchmark-prefix to include the name of +;;;; the source file containing the benchmark in the benchmark name, to +;;;; provide each file with its own namespace. + + +;;;; ITERATION COUNTS +;;;; +;;;; Every benchmark has to be given an iteration count that indicates how +;;;; often it should be executed. The reason is, that in most cases a single +;;;; execution of the benchmark code would not deliver usable timing results: +;;;; The resolution of the system time is not arbitrarily fine. Thus, some +;;;; benchmarks would be executed too quickly to be measured at all. A rule +;;;; of thumb is, that the longer a benchmark runs, the more exact is the +;;;; information about the execution time. +;;;; +;;;; However, execution time depends on several influences: First, the +;;;; machine you are running the benchmark on. Second, the compiler you use. +;;;; Third, which compiler options you use. Fourth, which version of guile +;;;; you are using. Fifth, which guile options you are using (for example if +;;;; you are using the debugging evaluator or not). There are even more +;;;; influences. +;;;; +;;;; For this reason, the same number of iterations for a single benchmark may +;;;; lead to completely different execution times in different +;;;; constellations. For someone working on a slow machine, the default +;;;; execution counts may lead to an inacceptable execution time of the +;;;; benchmark suite. For someone on a very fast machine, however, it may be +;;;; desireable to increase the number of iterations in order to increase the +;;;; accuracy of the time data. +;;;; +;;;; For this reason, the benchmark suite allows to scale the number of +;;;; executions by a global factor, stored in the exported variable +;;;; iteration-factor. The default for iteration-factor is 1. A number of 2 +;;;; means, that all benchmarks are executed twice as often, which will also +;;;; roughly double the execution time for the benchmark suite. Similarly, if +;;;; iteration-factor holds a value of 0.5, only about half the execution time +;;;; will be required. +;;;; +;;;; It is probably a good idea to choose the iteration count for each +;;;; benchmark such that all benchmarks will take about the same time, for +;;;; example one second. To achieve this, the benchmark suite holds an empty +;;;; benchmark in the file 0-reference.bm named "reference benchmark for +;;;; iteration counts". It's iteration count is calibrated to make the +;;;; benchmark run about one second on Dirk's laptop :-) If you are adding +;;;; benchmarks to the suite, it would be nice if you could calibrate the +;;;; number of iterations such that each of your added benchmarks takes about +;;;; as long to run as the reference benchmark. But: Don't be too accurate +;;;; to figure out the correct iteration count. + + +;;;; REPORTERS +;;;; +;;;; A reporter is a function which we apply to each benchmark outcome. +;;;; Reporters can log results, print interesting results to the standard +;;;; output, collect statistics, etc. +;;;; +;;;; A reporter function takes the following arguments: NAME ITERATIONS +;;;; BEFORE AFTER GC-TIME. The argument NAME holds the name of the benchmark, +;;;; ITERATIONS holds the actual number of iterations that were performed. +;;;; BEFORE holds the result of the function (times) at the very beginning of +;;;; the excution of the benchmark, AFTER holds the result of the function +;;;; (times) after the execution of the benchmark. GC-TIME, finally, holds +;;;; the difference of calls to (gc-run-time) before and after the execution +;;;; of the benchmark. +;;;; +;;;; This library provides some standard reporters for logging results +;;;; to a file, reporting interesting results to the user, (FIXME: and +;;;; collecting totals). +;;;; +;;;; You can use the REGISTER-REPORTER function and friends to add whatever +;;;; reporting functions you like. See under ;;;; TIMING DATA to see how the +;;;; library helps you to extract relevant timing information from the values +;;;; ITERATIONS, BEFORE, AFTER and GC-TIME. If you don't register any +;;;; reporters, the library uses USER-REPORTER, which writes the most +;;;; interesting results to the standard output. + + +;;;; TIME CALCULATION +;;;; +;;;; The library uses the guile functions (times) and (gc-run-time) to +;;;; determine the execution time for a single benchmark. Based on these +;;;; functions, the values of BEFORE, AFTER and GC-TIME are computed, which +;;;; are then passed to the reporter functions. All three values BEFORE, +;;;; AFTER and GC-TIME include the time needed to executed the benchmark code +;;;; itself, but also the surrounding code that implements the loop to run the +;;;; benchmark code for the given number of times. This is undesirable, since +;;;; one would prefer to only get the timing data for the benchmarking code. +;;;; +;;;; To cope with this, the benchmarking framework uses a trick: During +;;;; initialization of the library, the time for executing an empty benchmark +;;;; is measured and stored. This is an estimate for the time needed by the +;;;; benchmarking framework itself. For later benchmarks, this time can then +;;;; be subtracted from the measured execution times. +;;;; +;;;; In order to simplify the time calculation for users who want to write +;;;; their own reporters, benchmarking framework provides the following +;;;; definitions: +;;;; +;;;; benchmark-time-base : This variable holds the number of time units that +;;;; make up a second. By deviding the results of each of the functions +;;;; below by this value, you get the corresponding time in seconds. For +;;;; example (/ (benchmark-total-time before after) benchmark-time-base) +;;;; will give you the total time in seconds. +;;;; benchmark-total-time : this function takes two arguments BEFORE and AFTER +;;;; and computes the total time between the two timestamps. The result +;;;; of this function is what the time command of the unix command line +;;;; would report as real time. +;;;; benchmark-user-time : this function takes two arguments BEFORE and AFTER +;;;; and computes the time spent in the benchmarking process between the +;;;; two timestamps. That means, the time consumed by other processes +;;;; running on the same machine is not part of the resulting time, +;;;; neither is time spent within the operating system. The result of +;;;; this function is what the time command of the unix command line would +;;;; report as user time. +;;;; benchmark-system-time : similar to benchmark-user-time, but here the time +;;;; spent within the operating system is given. The result of this +;;;; function is what the time command of the unix command line would +;;;; report as system time. +;;;; benchmark-frame-time : this function takes the argument ITERATIONS. It +;;;; reports the part of the user time that is consumed by the +;;;; benchmarking framework itself to run some benchmark for the given +;;;; number of iterations. You can think of this as the time that would +;;;; still be consumed, even if the benchmarking code itself was empty. +;;;; This value does not include any time for garbage collection, even if +;;;; it is the benchmarking framework which is responsible for causing a +;;;; garbage collection. +;;;; benchmark-core-time : this function takes three arguments ITERATIONS, +;;;; BEFORE and AFTER. It reports the part of the user time that is +;;;; actually spent within the benchmarking code. That is, the time +;;;; needed for the benchmarking framework is subtracted from the user +;;;; time. This value, however, includes all garbage collection times, +;;;; even if some part of the gc-time had actually to be attributed to the +;;;; benchmarking framework. +;;;; benchmark-user-time\interpreter : this function takes three arguments +;;;; BEFORE AFTER and GC-TIME. It reports the part of the user time that +;;;; is spent in the interpreter (and not in garbage collection). +;;;; benchmark-core-time\interpreter : this function takes four arguments +;;;; ITERATIONS, BEFORE, AFTER. and GC-TIME. It reports the part of the +;;;; benchmark-core-time that is spent in the interpreter (and not in +;;;; garbage collection). This value is most probably the one you are +;;;; interested in, except if you are doing some garbage collection +;;;; checks. +;;;; +;;;; There is no function to calculate the garbage-collection time, since the +;;;; garbage collection time is already passed as an argument GC-TIME to the +;;;; reporter functions. + + +;;;; MISCELLANEOUS +;;;; + +;;; Perform a division and convert the result to inexact. +(define (i/ a b) + (exact->inexact (/ a b))) + +;;; Scale the number of iterations according to the given scaling factor. +(define iteration-factor 1) +(define (scale-iterations iterations) + (let* ((i (inexact->exact (round (* iterations iteration-factor))))) + (if (< i 1) 1 i))) + + +;;;; CORE FUNCTIONS +;;;; + +;;; The central routine for executing benchmarks. +;;; The idea is taken from Greg, the GNUstep regression test environment. +(define run-benchmark #f) +(let ((benchmark-running #f)) + (define (local-run-benchmark name iterations thunk) + (if benchmark-running + (error "Nested calls to run-benchmark are not permitted.") + (let ((benchmark-name (full-name name)) + (iterations (scale-iterations iterations))) + (set! benchmark-running #t) + (let ((before #f) (after #f) (gc-time #f)) + (gc) + (set! gc-time (gc-run-time)) + (set! before (times)) + (do ((i 0 (+ i 1))) + ((= i iterations)) + (thunk)) + (set! after (times)) + (set! gc-time (- (gc-run-time) gc-time)) + (report benchmark-name iterations before after gc-time)) + (set! benchmark-running #f)))) + (set! run-benchmark local-run-benchmark)) + +;;; A short form for benchmarks. +(defmacro benchmark (name iterations body . rest) + `(,run-benchmark ,name ,iterations (lambda () ,body ,@rest))) + + +;;;; BENCHMARK NAMES +;;;; + +;;;; Turn a benchmark name into a nice human-readable string. +(define (format-benchmark-name name) + (call-with-output-string + (lambda (port) + (let loop ((name name) + (separator "")) + (if (pair? name) + (begin + (display separator port) + (display (car name) port) + (loop (cdr name) ": "))))))) + +;;;; For a given benchmark-name, deliver the full name including all prefixes. +(define (full-name name) + (append (current-benchmark-prefix) (list name))) + +;;; A fluid containing the current benchmark prefix, as a list. +(define prefix-fluid (make-fluid)) +(fluid-set! prefix-fluid '()) +(define (current-benchmark-prefix) + (fluid-ref prefix-fluid)) + +;;; Postpend PREFIX to the current name prefix while evaluting THUNK. +;;; The name prefix is only changed within the dynamic scope of the +;;; call to with-benchmark-prefix*. Return the value returned by THUNK. +(define (with-benchmark-prefix* prefix thunk) + (with-fluids ((prefix-fluid + (append (fluid-ref prefix-fluid) (list prefix)))) + (thunk))) + +;;; (with-benchmark-prefix PREFIX BODY ...) +;;; Postpend PREFIX to the current name prefix while evaluating BODY ... +;;; The name prefix is only changed within the dynamic scope of the +;;; with-benchmark-prefix expression. Return the value returned by the last +;;; BODY expression. +(defmacro with-benchmark-prefix (prefix . body) + `(with-benchmark-prefix* ,prefix (lambda () ,@body))) + + +;;;; TIME CALCULATION +;;;; + +(define benchmark-time-base + internal-time-units-per-second) + +(define time-base ;; short-cut, not exported + benchmark-time-base) + +(define frame-time/iteration + "") + +(define (benchmark-total-time before after) + (- (tms:clock after) (tms:clock before))) + +(define (benchmark-user-time before after) + (- (tms:utime after) (tms:utime before))) + +(define (benchmark-system-time before after) + (- (tms:stime after) (tms:stime before))) + +(define (benchmark-frame-time iterations) + (* iterations frame-time/iteration)) + +(define (benchmark-core-time iterations before after) + (- (benchmark-user-time before after) (benchmark-frame-time iterations))) + +(define (benchmark-user-time\interpreter before after gc-time) + (- (benchmark-user-time before after) gc-time)) + +(define (benchmark-core-time\interpreter iterations before after gc-time) + (- (benchmark-core-time iterations before after) gc-time)) + + +;;;; REPORTERS +;;;; + +;;; The global list of reporters. +(define reporters '()) + +;;; The default reporter, to be used only if no others exist. +(define default-reporter #f) + +;;; Add the procedure REPORTER to the current set of reporter functions. +;;; Signal an error if that reporter procedure object is already registered. +(define (register-reporter reporter) + (if (memq reporter reporters) + (error "register-reporter: reporter already registered: " reporter)) + (set! reporters (cons reporter reporters))) + +;;; Remove the procedure REPORTER from the current set of reporter +;;; functions. Signal an error if REPORTER is not currently registered. +(define (unregister-reporter reporter) + (if (memq reporter reporters) + (set! reporters (delq! reporter reporters)) + (error "unregister-reporter: reporter not registered: " reporter))) + +;;; Return true iff REPORTER is in the current set of reporter functions. +(define (reporter-registered? reporter) + (if (memq reporter reporters) #t #f)) + +;;; Send RESULT to all currently registered reporter functions. +(define (report . args) + (if (pair? reporters) + (for-each (lambda (reporter) (apply reporter args)) + reporters) + (apply default-reporter args))) + + +;;;; Some useful standard reporters: +;;;; Log reporters write all benchmark results to a given log file. +;;;; Full reporters write all benchmark results to the standard output. +;;;; User reporters write some interesting results to the standard output. + +;;; Display a single benchmark result to the given port +(define (print-result port name iterations before after gc-time) + (let* ((name (format-benchmark-name name)) + (total-time (benchmark-total-time before after)) + (user-time (benchmark-user-time before after)) + (system-time (benchmark-system-time before after)) + (frame-time (benchmark-frame-time iterations)) + (benchmark-time (benchmark-core-time iterations before after)) + (user-time\interpreter + (benchmark-user-time\interpreter before after gc-time)) + (benchmark-core-time\interpreter + (benchmark-core-time\interpreter iterations before after gc-time))) + (write (list name iterations + 'total (i/ total-time time-base) + 'user (i/ user-time time-base) + 'system (i/ system-time time-base) + 'frame (i/ frame-time time-base) + 'benchmark (i/ benchmark-time time-base) + 'user/interp (i/ user-time\interpreter time-base) + 'bench/interp (i/ benchmark-core-time\interpreter time-base) + 'gc (i/ gc-time time-base)) + port) + (newline port))) + +;;; Return a reporter procedure which prints all results to the file +;;; FILE, in human-readable form. FILE may be a filename, or a port. +(define (make-log-reporter file) + (let ((port (if (output-port? file) file + (open-output-file file)))) + (lambda args + (apply print-result port args) + (force-output port)))) + +;;; A reporter that reports all results to the user. +(define (full-reporter . args) + (apply print-result (current-output-port) args)) + +;;; Display interesting results of a single benchmark to the given port +(define (print-user-result port name iterations before after gc-time) + (let* ((name (format-benchmark-name name)) + (user-time (benchmark-user-time before after)) + (benchmark-time (benchmark-core-time iterations before after)) + (benchmark-core-time\interpreter + (benchmark-core-time\interpreter iterations before after gc-time))) + (write (list name iterations + 'user (i/ user-time time-base) + 'benchmark (i/ benchmark-time time-base) + 'bench/interp (i/ benchmark-core-time\interpreter time-base) + 'gc (i/ gc-time time-base)) + port) + (newline port))) + +;;; A reporter that reports interesting results to the user. +(define (user-reporter . args) + (apply print-user-result (current-output-port) args)) + + +;;;; Initialize the benchmarking system: +;;;; + +;;; First, display version information +(display ";; running guile version " (current-output-port)) +(display (version) (current-output-port)) +(newline (current-output-port)) + +;;; Second, make sure the benchmarking routines are compiled. +(define (null-reporter . args) #t) +(set! default-reporter null-reporter) +(benchmark "empty initialization benchmark" 2 #t) + +;;; Third, initialize the system constants +(display ";; calibrating the benchmarking framework..." (current-output-port)) +(newline (current-output-port)) +(define (initialization-reporter name iterations before after gc-time) + (let* ((frame-time (- (tms:utime after) (tms:utime before) gc-time 3))) + (set! frame-time/iteration (/ frame-time iterations)) + (display ";; framework time per iteration: " (current-output-port)) + (display (i/ frame-time/iteration time-base) (current-output-port)) + (newline (current-output-port)))) +(set! default-reporter initialization-reporter) +(benchmark "empty initialization benchmark" 524288 #t) + +;;; Finally, set the default reporter +(set! default-reporter user-reporter) diff --git a/guile18/build-aux/config.rpath b/guile18/build-aux/config.rpath new file mode 100755 index 0000000000..35f959b87c --- /dev/null +++ b/guile18/build-aux/config.rpath @@ -0,0 +1,666 @@ +#! /bin/sh +# Output a system dependent set of variables, describing how to set the +# run time search path of shared libraries in an executable. +# +# Copyright 1996-2008 Free Software Foundation, Inc. +# Taken from GNU libtool, 2001 +# Originally by Gordon Matzigkeit , 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. +# +# The first argument passed to this file is the canonical host specification, +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld +# should be set by the caller. +# +# The set of defined variables is at the end of this script. + +# Known limitations: +# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer +# than 256 bytes, otherwise the compiler driver will dump core. The only +# known workaround is to choose shorter directory names for the build +# directory and/or the installation directory. + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a +shrext=.so + +host="$1" +host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +# Code taken from libtool.m4's _LT_CC_BASENAME. + +for cc_temp in $CC""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` + +# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC. + +wl= +if test "$GCC" = yes; then + wl='-Wl,' +else + case "$host_os" in + aix*) + wl='-Wl,' + ;; + darwin*) + case $cc_basename in + xlc*) + wl='-Wl,' + ;; + esac + ;; + mingw* | cygwin* | pw32* | os2*) + ;; + hpux9* | hpux10* | hpux11*) + wl='-Wl,' + ;; + irix5* | irix6* | nonstopux*) + wl='-Wl,' + ;; + newsos6) + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + icc* | ecc*) + wl='-Wl,' + ;; + pgcc | pgf77 | pgf90) + wl='-Wl,' + ;; + ccc*) + wl='-Wl,' + ;; + como) + wl='-lopt=' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + wl='-Wl,' + ;; + esac + ;; + esac + ;; + osf3* | osf4* | osf5*) + wl='-Wl,' + ;; + rdos*) + ;; + solaris*) + wl='-Wl,' + ;; + sunos4*) + wl='-Qoption ld ' + ;; + sysv4 | sysv4.2uw2* | sysv4.3*) + wl='-Wl,' + ;; + sysv4*MP*) + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + wl='-Wl,' + ;; + unicos*) + wl='-Wl,' + ;; + uts4*) + ;; + esac +fi + +# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. + +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no + +case "$host_os" in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; +esac + +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + # Unlike libtool, we use -rpath here, not --rpath, since the documented + # option of GNU ld is called -rpath, not --rpath. + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + case "$host_os" in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + fi + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we cannot use + # them. + ld_shlibs=no + ;; + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + cygwin* | mingw* | pw32*) + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + interix[3-9]*) + hardcode_direct=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + gnu* | linux* | k*bsd*-gnu) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + netbsd*) + ;; + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + else + ld_shlibs=no + fi + ;; + esac + ;; + sunos4*) + hardcode_direct=yes + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + esac + if test "$ld_shlibs" = no; then + hardcode_libdir_flag_spec= + fi +else + case "$host_os" in + aix3*) + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + else + aix_use_runtimelinking=no + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + fi + hardcode_direct=yes + hardcode_libdir_separator=':' + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + fi + # Begin _LT_AC_SYS_LIBPATH_AIX. + echo 'int main () { return 0; }' > conftest.c + ${CC} ${LDFLAGS} conftest.c -o conftest + aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + fi + if test -z "$aix_libpath"; then + aix_libpath="/usr/lib:/lib" + fi + rm -f conftest.c conftest + # End _LT_AC_SYS_LIBPATH_AIX. + if test "$aix_use_runtimelinking" = yes; then + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + else + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + fi + fi + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + bsdi[45]*) + ;; + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + libext=lib + ;; + darwin* | rhapsody*) + hardcode_direct=no + if test "$GCC" = yes ; then + : + else + case $cc_basename in + xlc*) + ;; + *) + ld_shlibs=no + ;; + esac + fi + ;; + dgux*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + freebsd1*) + ld_shlibs=no + ;; + freebsd2.2*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + freebsd2*) + hardcode_direct=yes + hardcode_minus_L=yes + ;; + freebsd* | dragonfly*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + hpux9*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + hpux10*) + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + hpux11*) + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + ;; + *) + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + irix5* | irix6* | nonstopux*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + netbsd*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + newsos6) + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + else + case "$host_os" in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + osf3*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + osf4* | osf5*) + if test "$GCC" = yes; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + # Both cc and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + solaris*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + sunos4*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + ;; + sysv4) + case $host_vendor in + sni) + hardcode_direct=yes # is this really true??? + ;; + siemens) + hardcode_direct=no + ;; + motorola) + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + ;; + sysv4.3*) + ;; + sysv4*MP*) + if test -d /usr/nec; then + ld_shlibs=yes + fi + ;; + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + ;; + sysv5* | sco3.2v5* | sco5v6*) + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator=':' + ;; + uts4*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + *) + ld_shlibs=no + ;; + esac +fi + +# Check dynamic linker characteristics +# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. +# Unlike libtool.m4, here we don't care about _all_ names of the library, but +# only about the one the linker finds when passed -lNAME. This is the last +# element of library_names_spec in libtool.m4, or possibly two of them if the +# linker has special search rules. +library_names_spec= # the last element of library_names_spec in libtool.m4 +libname_spec='lib$name' +case "$host_os" in + aix3*) + library_names_spec='$libname.a' + ;; + aix[4-9]*) + library_names_spec='$libname$shrext' + ;; + amigaos*) + library_names_spec='$libname.a' + ;; + beos*) + library_names_spec='$libname$shrext' + ;; + bsdi[45]*) + library_names_spec='$libname$shrext' + ;; + cygwin* | mingw* | pw32*) + shrext=.dll + library_names_spec='$libname.dll.a $libname.lib' + ;; + darwin* | rhapsody*) + shrext=.dylib + library_names_spec='$libname$shrext' + ;; + dgux*) + library_names_spec='$libname$shrext' + ;; + freebsd1*) + ;; + freebsd* | dragonfly*) + case "$host_os" in + freebsd[123]*) + library_names_spec='$libname$shrext$versuffix' ;; + *) + library_names_spec='$libname$shrext' ;; + esac + ;; + gnu*) + library_names_spec='$libname$shrext' + ;; + hpux9* | hpux10* | hpux11*) + case $host_cpu in + ia64*) + shrext=.so + ;; + hppa*64*) + shrext=.sl + ;; + *) + shrext=.sl + ;; + esac + library_names_spec='$libname$shrext' + ;; + interix[3-9]*) + library_names_spec='$libname$shrext' + ;; + irix5* | irix6* | nonstopux*) + library_names_spec='$libname$shrext' + case "$host_os" in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; + *) libsuff= shlibsuff= ;; + esac + ;; + esac + ;; + linux*oldld* | linux*aout* | linux*coff*) + ;; + linux* | k*bsd*-gnu) + library_names_spec='$libname$shrext' + ;; + knetbsd*-gnu) + library_names_spec='$libname$shrext' + ;; + netbsd*) + library_names_spec='$libname$shrext' + ;; + newsos6) + library_names_spec='$libname$shrext' + ;; + nto-qnx*) + library_names_spec='$libname$shrext' + ;; + openbsd*) + library_names_spec='$libname$shrext$versuffix' + ;; + os2*) + libname_spec='$name' + shrext=.dll + library_names_spec='$libname.a' + ;; + osf3* | osf4* | osf5*) + library_names_spec='$libname$shrext' + ;; + rdos*) + ;; + solaris*) + library_names_spec='$libname$shrext' + ;; + sunos4*) + library_names_spec='$libname$shrext$versuffix' + ;; + sysv4 | sysv4.3*) + library_names_spec='$libname$shrext' + ;; + sysv4*MP*) + library_names_spec='$libname$shrext' + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + library_names_spec='$libname$shrext' + ;; + uts4*) + library_names_spec='$libname$shrext' + ;; +esac + +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' +escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` +shlibext=`echo "$shrext" | sed -e 's,^\.,,'` +escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` +escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` +escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` + +LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. +# +# The first argument passed to this file is the canonical host specification, +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld +# should be set by the caller. +# +# The set of defined variables is at the end of this script. + +# Known limitations: +# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer +# than 256 bytes, otherwise the compiler driver will dump core. The only +# known workaround is to choose shorter directory names for the build +# directory and/or the installation directory. + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a +shrext=.so + +host="$1" +host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +# Code taken from libtool.m4's _LT_CC_BASENAME. + +for cc_temp in $CC""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` + +# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC. + +wl= +if test "$GCC" = yes; then + wl='-Wl,' +else + case "$host_os" in + aix*) + wl='-Wl,' + ;; + darwin*) + case $cc_basename in + xlc*) + wl='-Wl,' + ;; + esac + ;; + mingw* | cygwin* | pw32* | os2*) + ;; + hpux9* | hpux10* | hpux11*) + wl='-Wl,' + ;; + irix5* | irix6* | nonstopux*) + wl='-Wl,' + ;; + newsos6) + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + icc* | ecc*) + wl='-Wl,' + ;; + pgcc | pgf77 | pgf90) + wl='-Wl,' + ;; + ccc*) + wl='-Wl,' + ;; + como) + wl='-lopt=' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + wl='-Wl,' + ;; + esac + ;; + esac + ;; + osf3* | osf4* | osf5*) + wl='-Wl,' + ;; + rdos*) + ;; + solaris*) + wl='-Wl,' + ;; + sunos4*) + wl='-Qoption ld ' + ;; + sysv4 | sysv4.2uw2* | sysv4.3*) + wl='-Wl,' + ;; + sysv4*MP*) + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + wl='-Wl,' + ;; + unicos*) + wl='-Wl,' + ;; + uts4*) + ;; + esac +fi + +# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. + +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no + +case "$host_os" in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; +esac + +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + # Unlike libtool, we use -rpath here, not --rpath, since the documented + # option of GNU ld is called -rpath, not --rpath. + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + case "$host_os" in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + fi + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we cannot use + # them. + ld_shlibs=no + ;; + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + cygwin* | mingw* | pw32*) + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + interix[3-9]*) + hardcode_direct=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + gnu* | linux* | k*bsd*-gnu) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + netbsd*) + ;; + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + else + ld_shlibs=no + fi + ;; + esac + ;; + sunos4*) + hardcode_direct=yes + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + esac + if test "$ld_shlibs" = no; then + hardcode_libdir_flag_spec= + fi +else + case "$host_os" in + aix3*) + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + else + aix_use_runtimelinking=no + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + fi + hardcode_direct=yes + hardcode_libdir_separator=':' + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + fi + # Begin _LT_AC_SYS_LIBPATH_AIX. + echo 'int main () { return 0; }' > conftest.c + ${CC} ${LDFLAGS} conftest.c -o conftest + aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + fi + if test -z "$aix_libpath"; then + aix_libpath="/usr/lib:/lib" + fi + rm -f conftest.c conftest + # End _LT_AC_SYS_LIBPATH_AIX. + if test "$aix_use_runtimelinking" = yes; then + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + else + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + fi + fi + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + bsdi[45]*) + ;; + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + libext=lib + ;; + darwin* | rhapsody*) + hardcode_direct=no + if test "$GCC" = yes ; then + : + else + case $cc_basename in + xlc*) + ;; + *) + ld_shlibs=no + ;; + esac + fi + ;; + dgux*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + freebsd1*) + ld_shlibs=no + ;; + freebsd2.2*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + freebsd2*) + hardcode_direct=yes + hardcode_minus_L=yes + ;; + freebsd* | dragonfly*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + hpux9*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + hpux10*) + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + hpux11*) + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + ;; + *) + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + irix5* | irix6* | nonstopux*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + netbsd*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + newsos6) + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + else + case "$host_os" in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + osf3*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + osf4* | osf5*) + if test "$GCC" = yes; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + # Both cc and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + solaris*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + sunos4*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + ;; + sysv4) + case $host_vendor in + sni) + hardcode_direct=yes # is this really true??? + ;; + siemens) + hardcode_direct=no + ;; + motorola) + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + ;; + sysv4.3*) + ;; + sysv4*MP*) + if test -d /usr/nec; then + ld_shlibs=yes + fi + ;; + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + ;; + sysv5* | sco3.2v5* | sco5v6*) + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator=':' + ;; + uts4*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + *) + ld_shlibs=no + ;; + esac +fi + +# Check dynamic linker characteristics +# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. +# Unlike libtool.m4, here we don't care about _all_ names of the library, but +# only about the one the linker finds when passed -lNAME. This is the last +# element of library_names_spec in libtool.m4, or possibly two of them if the +# linker has special search rules. +library_names_spec= # the last element of library_names_spec in libtool.m4 +libname_spec='lib$name' +case "$host_os" in + aix3*) + library_names_spec='$libname.a' + ;; + aix[4-9]*) + library_names_spec='$libname$shrext' + ;; + amigaos*) + library_names_spec='$libname.a' + ;; + beos*) + library_names_spec='$libname$shrext' + ;; + bsdi[45]*) + library_names_spec='$libname$shrext' + ;; + cygwin* | mingw* | pw32*) + shrext=.dll + library_names_spec='$libname.dll.a $libname.lib' + ;; + darwin* | rhapsody*) + shrext=.dylib + library_names_spec='$libname$shrext' + ;; + dgux*) + library_names_spec='$libname$shrext' + ;; + freebsd1*) + ;; + freebsd* | dragonfly*) + case "$host_os" in + freebsd[123]*) + library_names_spec='$libname$shrext$versuffix' ;; + *) + library_names_spec='$libname$shrext' ;; + esac + ;; + gnu*) + library_names_spec='$libname$shrext' + ;; + hpux9* | hpux10* | hpux11*) + case $host_cpu in + ia64*) + shrext=.so + ;; + hppa*64*) + shrext=.sl + ;; + *) + shrext=.sl + ;; + esac + library_names_spec='$libname$shrext' + ;; + interix[3-9]*) + library_names_spec='$libname$shrext' + ;; + irix5* | irix6* | nonstopux*) + library_names_spec='$libname$shrext' + case "$host_os" in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; + *) libsuff= shlibsuff= ;; + esac + ;; + esac + ;; + linux*oldld* | linux*aout* | linux*coff*) + ;; + linux* | k*bsd*-gnu) + library_names_spec='$libname$shrext' + ;; + knetbsd*-gnu) + library_names_spec='$libname$shrext' + ;; + netbsd*) + library_names_spec='$libname$shrext' + ;; + newsos6) + library_names_spec='$libname$shrext' + ;; + nto-qnx*) + library_names_spec='$libname$shrext' + ;; + openbsd*) + library_names_spec='$libname$shrext$versuffix' + ;; + os2*) + libname_spec='$name' + shrext=.dll + library_names_spec='$libname.a' + ;; + osf3* | osf4* | osf5*) + library_names_spec='$libname$shrext' + ;; + rdos*) + ;; + solaris*) + library_names_spec='$libname$shrext' + ;; + sunos4*) + library_names_spec='$libname$shrext$versuffix' + ;; + sysv4 | sysv4.3*) + library_names_spec='$libname$shrext' + ;; + sysv4*MP*) + library_names_spec='$libname$shrext' + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + library_names_spec='$libname$shrext' + ;; + uts4*) + library_names_spec='$libname$shrext' + ;; +esac + +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' +escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` +shlibext=`echo "$shrext" | sed -e 's,^\.,,'` +escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` +escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` +escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` + +LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' < not found. See README.])]) + +AC_CHECK_PROG(have_makeinfo, makeinfo, yes, no) +AM_CONDITIONAL(HAVE_MAKEINFO, test "$have_makeinfo" = yes) + +AM_PATH_LISPDIR + +#-------------------------------------------------------------------- +# +# User options (after above tests that may set default CFLAGS etc.) +# +#-------------------------------------------------------------------- + +GUILE_ERROR_ON_WARNING="yes" + +AC_ARG_ENABLE(error-on-warning, + [ --enable-error-on-warning treat compile warnings as errors], + [case "${enableval}" in + yes | y) GUILE_ERROR_ON_WARNING="yes" ;; + no | n) GUILE_ERROR_ON_WARNING="no" ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-error-on-warning) ;; + esac]) + +SCM_I_GSC_GUILE_DEBUG_FREELIST=0 +AC_ARG_ENABLE(debug-freelist, + [ --enable-debug-freelist include garbage collector freelist debugging code], + if test "$enable_debug_freelist" = y \ + || test "$enable_debug_freelist" = yes; then + SCM_I_GSC_GUILE_DEBUG_FREELIST=1 + fi) + +AC_ARG_ENABLE(debug-malloc, + [ --enable-debug-malloc include malloc debugging code], + if test "$enable_debug_malloc" = y || test "$enable_debug_malloc" = yes; then + AC_DEFINE(GUILE_DEBUG_MALLOC, 1, + [Define this if you want to debug scm_must_malloc/realloc/free calls.]) + fi) + +SCM_I_GSC_GUILE_DEBUG=0 +AC_ARG_ENABLE(guile-debug, + [AS_HELP_STRING([--enable-guile-debug], + [include internal debugging functions])], + if test "$enable_guile_debug" = y || test "$enable_guile_debug" = yes; then + SCM_I_GSC_GUILE_DEBUG=1 + fi) + +AC_ARG_ENABLE(posix, + [ --disable-posix omit posix interfaces],, + enable_posix=yes) + +AC_ARG_ENABLE(networking, + [ --disable-networking omit networking interfaces],, + enable_networking=yes) + +AC_ARG_ENABLE(regex, + [ --disable-regex omit regular expression interfaces],, + enable_regex=yes) + +AC_ARG_ENABLE([discouraged], + AS_HELP_STRING([--disable-discouraged],[omit discouraged features])) + +if test "$enable_discouraged" = no; then + SCM_I_GSC_ENABLE_DISCOURAGED=0 +else + SCM_I_GSC_ENABLE_DISCOURAGED=1 +fi + +AC_ARG_ENABLE([deprecated], + AS_HELP_STRING([--disable-deprecated],[omit deprecated features])) + +if test "$enable_deprecated" = no; then + SCM_I_GSC_ENABLE_DEPRECATED=0 + warn_default=no +else + if test "$enable_deprecated" = yes || test "$enable_deprecated" = ""; then + warn_default=summary + elif test "$enable_deprecated" = shutup; then + warn_default=no + else + warn_default=$enable_deprecated + fi + SCM_I_GSC_ENABLE_DEPRECATED=1 +fi +AC_DEFINE_UNQUOTED(SCM_WARN_DEPRECATED_DEFAULT, "$warn_default", +[Define this to control the default warning level for deprecated features.]) + +AC_ARG_ENABLE(elisp, + [ --disable-elisp omit Emacs Lisp support],, + enable_elisp=yes) + +dnl Added the following configure option in January 2008 following +dnl investigation of problems with "64" system and library calls on +dnl Darwin (MacOS X). The libguile code (_scm.h) assumes that if a +dnl system has stat64, it will have all the other 64 APIs too; but on +dnl Darwin, stat64 is there but other APIs are missing. +dnl +dnl It also appears, from the Darwin docs, that most system call APIs +dnl there (i.e. the traditional ones _without_ "64" in their names) have +dnl been 64-bit-capable for a long time now, so it isn't necessary to +dnl use "64" versions anyway. For example, Darwin's off_t is 64-bit. +dnl +dnl A similar problem has been reported for HP-UX: +dnl http://www.nabble.com/Building-guile-1.8.2-on-hpux-td13106681.html +dnl +dnl Therefore, and also because a Guile without LARGEFILE64 support is +dnl better than no Guile at all, we provide this option to suppress +dnl trying to use "64" calls. +dnl +dnl It may be that for some 64-bit function on Darwin/HP-UX we do need +dnl to use a "64" call, and hence that by using --without-64-calls we're +dnl missing out on that. If so, someone can work on that in the future. +dnl For now, --without-64-calls allows Guile to build on OSs where it +dnl wasn't building before. +AC_MSG_CHECKING([whether to use system and library "64" calls]) +AC_ARG_WITH([64-calls], + AS_HELP_STRING([--without-64-calls], + [don't attempt to use system and library calls with "64" in their names]), + [use_64_calls=$withval], + [use_64_calls=yes + case $host in + *-apple-darwin* ) + use_64_calls=no + ;; + powerpc-ibm-aix* ) + use_64_calls=no + ;; + esac]) +AC_MSG_RESULT($use_64_calls) +case "$use_64_calls" in + y* ) + AC_DEFINE(GUILE_USE_64_CALLS, 1, + [Define to 1 in order to try to use "64" versions of system and library calls.]) + ;; +esac + +AC_MSG_CHECKING([whether the compiler defaults to IEEE floating point behavior]) +# The following snippet was taken from Gnulib's `fpieee'. See also the definition +# of `guile_NaN' in `numbers.c'. + +# IEEE behaviour is the default on all CPUs except Alpha and SH +# (according to the test results of Bruno Haible's ieeefp/fenv_default.m4 +# and the GCC 4.1.2 manual). +case "$host_cpu" in +alpha*) + # On Alpha systems, a compiler option provides the behaviour. + # See the ieee(3) manual page, also available at + # + AC_MSG_RESULT([no]) + if test -n "$GCC"; then + # GCC has the option -mieee. + CPPFLAGS="$CPPFLAGS -mieee" + else + # Compaq (ex-DEC) C has the option -ieee. + CPPFLAGS="$CPPFLAGS -ieee" + fi + ;; +sh*) + AC_MSG_RESULT([no]) + if test -n "$GCC"; then + # GCC has the option -mieee. + CPPFLAGS="$CPPFLAGS -mieee" + fi + ;; +*) + AC_MSG_RESULT([yes]) + ;; +esac + + +#-------------------------------------------------------------------- + +dnl Check for dynamic linking + +use_modules=yes +AC_ARG_WITH(modules, +[ --with-modules[=FILES] Add support for dynamic modules], +use_modules="$withval") +test -z "$use_modules" && use_modules=yes +DLPREOPEN= +if test "$use_modules" != no; then + if test "$use_modules" = yes; then + DLPREOPEN="-dlpreopen force" + else + DLPREOPEN="-export-dynamic" + for module in $use_modules; do + DLPREOPEN="$DLPREOPEN -dlopen $module" + done + fi +fi + +dnl files which are destined for separate modules. + +if test "$use_modules" != no; then + AC_LIBOBJ([dynl]) +fi + +if test "$enable_posix" = yes; then + AC_LIBOBJ([filesys]) + AC_LIBOBJ([posix]) + AC_DEFINE(HAVE_POSIX, 1, + [Define this if you want support for POSIX system calls in Guile.]) +fi + +if test "$enable_networking" = yes; then + AC_LIBOBJ([net_db]) + AC_LIBOBJ([socket]) + AC_DEFINE(HAVE_NETWORKING, 1, + [Define this if you want support for networking in Guile.]) +fi + +if test "$enable_debug_malloc" = yes; then + AC_LIBOBJ([debug-malloc]) +fi + +if test "$enable_elisp" = yes; then + SCM_I_GSC_ENABLE_ELISP=1 +else + SCM_I_GSC_ENABLE_ELISP=0 +fi +AC_CHECK_LIB(uca, __uc_get_ar_bsp) + +AC_C_CONST + +# "volatile" is used in a couple of tests below. +AC_C_VOLATILE + +AC_C_INLINE +if test "$ac_cv_c_inline" != no; then + SCM_I_GSC_C_INLINE="\"${ac_cv_c_inline}\"" +else + SCM_I_GSC_C_INLINE=NULL +fi +AC_CHECK_LIB(uca, __uc_get_ar_bsp) + +AC_C_BIGENDIAN + +AC_CHECK_SIZEOF(char) +AC_CHECK_SIZEOF(unsigned char) +AC_CHECK_SIZEOF(short) +AC_CHECK_SIZEOF(unsigned short) +AC_CHECK_SIZEOF(int) +AC_CHECK_SIZEOF(unsigned int) +AC_CHECK_SIZEOF(long) +AC_CHECK_SIZEOF(unsigned long) +AC_CHECK_SIZEOF(size_t) +AC_CHECK_SIZEOF(long long) +AC_CHECK_SIZEOF(unsigned long long) +AC_CHECK_SIZEOF(__int64) +AC_CHECK_SIZEOF(unsigned __int64) +AC_CHECK_SIZEOF(void *) +AC_CHECK_SIZEOF(intptr_t) +AC_CHECK_SIZEOF(uintptr_t) +AC_CHECK_SIZEOF(ptrdiff_t) +AC_CHECK_SIZEOF(size_t) +AC_CHECK_SIZEOF(off_t) + +if test "$ac_cv_sizeof_long" -ne "$ac_cv_sizeof_void_p"; then + AC_MSG_ERROR(sizes of long and void* are not identical) +fi + +if test "$ac_cv_sizeof_ptrdiff_t" -ne 0; then + SCM_I_GSC_T_PTRDIFF='"ptrdiff_t"' +else + SCM_I_GSC_T_PTRDIFF='"long"' +fi +AC_SUBST([SCM_I_GSC_T_PTRDIFF]) + +AC_CHECK_HEADERS([stdint.h]) +AC_CHECK_HEADERS([inttypes.h]) + +AC_CHECK_SIZEOF(intmax_t) + +SCM_I_GSC_NEEDS_STDINT_H=0 +SCM_I_GSC_NEEDS_INTTYPES_H=0 + +### intptr and uintptr (try not to use inttypes if we don't have to) +if test "$ac_cv_header_inttypes_h" = yes; then + if test "$ac_cv_sizeof_intptr_t" -eq 0; then + AC_CHECK_SIZEOF([intptr_t],,[#include +#include ]) + if test "$ac_cv_sizeof_intptr_t" -ne 0; then + SCM_I_GSC_NEEDS_INTTYPES_H=1 + fi + fi + if test "$ac_cv_sizeof_uintptr_t" -eq 0; then + AC_CHECK_SIZEOF([uintptr_t],,[#include +#include ]) + if test "$ac_cv_sizeof_uintptr_t" -ne 0; then + SCM_I_GSC_NEEDS_INTTYPES_H=1 + fi + fi +fi + +### See what's provided by stdint.h +if test "$ac_cv_header_stdint_h" = yes; then + AC_CHECK_TYPE([int8_t],[scm_stdint_has_int8=1],,[#include ]) + AC_CHECK_TYPE([uint8_t],[scm_stdint_has_uint8=1],,[#include ]) + AC_CHECK_TYPE([int16_t],[scm_stdint_has_int16=1],,[#include ]) + AC_CHECK_TYPE([uint16_t],[scm_stdint_has_uint16=1],,[#include ]) + AC_CHECK_TYPE([int32_t],[scm_stdint_has_int32=1],,[#include ]) + AC_CHECK_TYPE([uint32_t],[scm_stdint_has_uint32=1],,[#include ]) + AC_CHECK_TYPE([int64_t],[scm_stdint_has_int64=1],,[#include ]) + AC_CHECK_TYPE([uint64_t],[scm_stdint_has_uint64=1],,[#include ]) + AC_CHECK_TYPE([intmax_t],[scm_stdint_has_intmax=1],,[#include ]) + AC_CHECK_TYPE([uintmax_t],[scm_stdint_has_uintmax=1],,[#include ]) +fi + +# so we don't get confused by the cache (wish there was a better way +# to check particular headers for the same type...) + +unset ac_cv_type_int8_t +unset ac_cv_type_uint8_t +unset ac_cv_type_int16_t +unset ac_cv_type_uint16_t +unset ac_cv_type_int32_t +unset ac_cv_type_uint32_t +unset ac_cv_type_int64_t +unset ac_cv_type_uint64_t +unset ac_cv_type_intmax_t +unset ac_cv_type_uintmax_t + +### See what's provided by inttypes.h +if test "$ac_cv_header_inttypes_h" = yes; then + AC_CHECK_TYPE([int8_t],[scm_inttypes_has_int8=1],,[#include ]) + AC_CHECK_TYPE([uint8_t],[scm_inttypes_has_uint8=1],,[#include ]) + AC_CHECK_TYPE([int16_t],[scm_inttypes_has_int16=1],,[#include ]) + AC_CHECK_TYPE([uint16_t],[scm_inttypes_has_uint16=1],,[#include ]) + AC_CHECK_TYPE([int32_t],[scm_inttypes_has_int32=1],,[#include ]) + AC_CHECK_TYPE([uint32_t],[scm_inttypes_has_uint32=1],,[#include ]) + AC_CHECK_TYPE([int64_t],[scm_inttypes_has_int64=1],,[#include ]) + AC_CHECK_TYPE([uint64_t],[scm_inttypes_has_uint64=1],,[#include ]) + AC_CHECK_TYPE([intmax_t],[scm_inttypes_has_intmax=1],,[#include ]) + AC_CHECK_TYPE([uintmax_t],[scm_inttypes_has_uintmax=1],,[#include ]) +fi + +# Try hard to find definitions for some required scm_t_*int* types. + +### Required type scm_t_int8 +if test "$scm_stdint_has_int8"; then + SCM_I_GSC_T_INT8='"int8_t"' + SCM_I_GSC_NEEDS_STDINT_H=1 +elif test "$scm_inttypes_has_int8"; then + SCM_I_GSC_T_INT8='"int8_t"' + SCM_I_GSC_NEEDS_INTTYPES_H=1 +elif test "$ac_cv_sizeof_char" -eq 1; then + SCM_I_GSC_T_INT8='"signed char"' +else + AC_MSG_ERROR([Can't find appropriate type for scm_t_int8.]) +fi +AC_SUBST([SCM_I_GSC_T_INT8]) + +### Required type scm_t_uint8 +if test "$scm_stdint_has_uint8"; then + SCM_I_GSC_T_UINT8='"uint8_t"' + SCM_I_GSC_NEEDS_STDINT_H=1 +elif test "$scm_inttypes_has_uint8"; then + SCM_I_GSC_T_UINT8='"uint8_t"' + SCM_I_GSC_NEEDS_INTTYPES_H=1 +elif test "$ac_cv_sizeof_unsigned_char" -eq 1; then + SCM_I_GSC_T_UINT8='"unsigned char"' +else + AC_MSG_ERROR([Can't find appropriate type for scm_t_uint8.]) +fi +AC_SUBST([SCM_I_GSC_T_UINT8]) + +### Required type scm_t_int16 (ANSI C says int or short might work) +if test "$scm_stdint_has_int16"; then + SCM_I_GSC_T_INT16='"int16_t"' + SCM_I_GSC_NEEDS_STDINT_H=1 +elif test "$scm_inttypes_has_int16"; then + SCM_I_GSC_T_INT16='"int16_t"' + SCM_I_GSC_NEEDS_INTTYPES_H=1 +elif test "$ac_cv_sizeof_int" -eq 2; then + SCM_I_GSC_T_INT16='"int"' +elif test "$ac_cv_sizeof_short" -eq 2; then + SCM_I_GSC_T_INT16='"short"' +else + AC_MSG_ERROR([Can't find appropriate type for scm_t_int16.]) +fi +AC_SUBST([SCM_I_GSC_T_INT16]) + +### Required type scm_t_uint16 (ANSI C says int or short might work) +if test "$scm_stdint_has_uint16"; then + SCM_I_GSC_T_UINT16='"uint16_t"' + SCM_I_GSC_NEEDS_STDINT_H=1 +elif test "$scm_inttypes_has_uint16"; then + SCM_I_GSC_T_UINT16='"uint16_t"' + SCM_I_GSC_NEEDS_INTTYPES_H=1 +elif test "$ac_cv_sizeof_unsigned_int" -eq 2; then + SCM_I_GSC_T_UINT16='"unsigned int"' +elif test "$ac_cv_sizeof_unsigned_short" -eq 2; then + SCM_I_GSC_T_UINT16='"unsigned short"' +else + AC_MSG_ERROR([Can't find appropriate type for scm_t_uint16.]) +fi +AC_SUBST([SCM_I_GSC_T_UINT16]) + + +### Required type scm_t_int32 (ANSI C says int, short, or long might work) +if test "$scm_stdint_has_int32"; then + SCM_I_GSC_T_INT32='"int32_t"' + SCM_I_GSC_NEEDS_STDINT_H=1 +elif test "$scm_inttypes_has_int32"; then + SCM_I_GSC_T_INT32='"int32_t"' + SCM_I_GSC_NEEDS_INTTYPES_H=1 +elif test "$ac_cv_sizeof_int" -eq 4; then + SCM_I_GSC_T_INT32='"int"' +elif test "$ac_cv_sizeof_long" -eq 4; then + SCM_I_GSC_T_INT32='"long"' +elif test "$ac_cv_sizeof_short" -eq 4; then + SCM_I_GSC_T_INT32='"short"' +else + AC_MSG_ERROR([Can't find appropriate type for scm_t_int32.]) +fi +AC_SUBST([SCM_I_GSC_T_INT32]) + +### Required type scm_t_uint32 (ANSI C says int, short, or long might work) +if test "$scm_stdint_has_uint32"; then + SCM_I_GSC_T_UINT32='"uint32_t"' + SCM_I_GSC_NEEDS_STDINT_H=1 +elif test "$scm_inttypes_has_uint32"; then + SCM_I_GSC_T_UINT32='"uint32_t"' + SCM_I_GSC_NEEDS_INTTYPES_H=1 +elif test "$ac_cv_sizeof_unsigned_int" -eq 4; then + SCM_I_GSC_T_UINT32='"unsigned int"' +elif test "$ac_cv_sizeof_unsigned_long" -eq 4; then + SCM_I_GSC_T_UINT32='"unsigned long"' +elif test "$ac_cv_sizeof_unsigned_short" -eq 4; then + SCM_I_GSC_T_UINT32='"unsigned short"' +else + AC_MSG_ERROR([Can't find appropriate type for scm_t_uint32.]) +fi +AC_SUBST([SCM_I_GSC_T_UINT32]) + +### Optional type scm_t_int64 (ANSI C says int, short, or long might work) +### Also try 'long long' and '__int64' if we have it. +SCM_I_GSC_T_INT64=0 +if test "$scm_stdint_has_int64"; then + SCM_I_GSC_T_INT64='"int64_t"' + SCM_I_GSC_NEEDS_STDINT_H=1 +elif test "$scm_inttypes_has_int64"; then + SCM_I_GSC_T_INT64='"int64_t"' + SCM_I_GSC_NEEDS_INTTYPES_H=1 +elif test "$ac_cv_sizeof_int" -eq 8; then + SCM_I_GSC_T_INT64='"int"' +elif test "$ac_cv_sizeof_long" -eq 8; then + SCM_I_GSC_T_INT64='"long"' +elif test "$ac_cv_sizeof_short" -eq 8; then + SCM_I_GSC_T_INT64='"short"' +elif test "$ac_cv_sizeof_long_long" -eq 8; then + SCM_I_GSC_T_INT64='"long long"' +elif test "$ac_cv_sizeof___int64" -eq 8; then + SCM_I_GSC_T_INT64='"__int64"' +else + AC_MSG_ERROR([Can't find appropriate type for scm_t_int64.]) +fi +AC_SUBST([SCM_I_GSC_T_INT64]) + + +### Optional type scm_t_uint64 (ANSI C says int, short, or long might work) +### Also try 'long long' and '__int64' if we have it. +SCM_I_GSC_T_UINT64=0 +if test "$scm_stdint_has_uint64"; then + SCM_I_GSC_T_UINT64='"uint64_t"' + SCM_I_GSC_NEEDS_STDINT_H=1 +elif test "$scm_inttypes_has_uint64"; then + SCM_I_GSC_T_UINT64='"uint64_t"' + SCM_I_GSC_NEEDS_INTTYPES_H=1 +elif test "$ac_cv_sizeof_unsigned_int" -eq 8; then + SCM_I_GSC_T_UINT64='"unsigned int"' +elif test "$ac_cv_sizeof_unsigned_long" -eq 8; then + SCM_I_GSC_T_UINT64='"unsigned long"' +elif test "$ac_cv_sizeof_unsigned_short" -eq 8; then + SCM_I_GSC_T_UINT64='"unsigned short"' +elif test "$ac_cv_sizeof_unsigned_long_long" -eq 8; then + SCM_I_GSC_T_UINT64='"unsigned long long"' +elif test "$ac_cv_sizeof_unsigned___int64" -eq 8; then + SCM_I_GSC_T_UINT64='"unsigned __int64"' +else + AC_MSG_ERROR([Can't find appropriate type for scm_t_uint64.]) +fi +AC_SUBST([SCM_I_GSC_T_UINT64]) + +### Required type scm_t_intmax +### +### We try 'intmax_t', '__int64', 'long long' in this order. When +### none of them is available, we use 'long'. +### +SCM_I_GSC_T_INTMAX=0 +if test "$scm_stdint_has_intmax"; then + SCM_I_GSC_T_INTMAX='"intmax_t"' + SCM_I_GSC_NEEDS_STDINT_H=1 +elif test "$scm_inttypes_has_intmax"; then + SCM_I_GSC_T_INTMAX='"intmax_t"' + SCM_I_GSC_NEEDS_INTTYPES_H=1 +elif test "$ac_cv_sizeof___int64" -ne 0; then + SCM_I_GSC_T_INTMAX='"__int64"' +elif test "$ac_cv_sizeof_long_long" -ne 0; then + SCM_I_GSC_T_INTMAX='"long long"' +else + SCM_I_GSC_T_INTMAX='"long"' +fi +AC_SUBST([SCM_I_GSC_T_INTMAX]) + +### Required type scm_t_uintmax +### +### We try 'uintmax_t', 'unsigned __int64', 'unsigned long long' in +### this order. When none of them is available, we use 'unsigned long'. +### +SCM_I_GSC_T_UINTMAX=0 +if test "$scm_stdint_has_uintmax"; then + SCM_I_GSC_T_UINTMAX='"uintmax_t"' + SCM_I_GSC_NEEDS_STDINT_H=1 +elif test "$scm_inttypes_has_uintmax"; then + SCM_I_GSC_T_UINTMAX='"uintmax_t"' + SCM_I_GSC_NEEDS_INTTYPES_H=1 +elif test "$ac_cv_sizeof_unsigned___int64" -ne 0; then + SCM_I_GSC_T_UINTMAX='"unsigned __int64"' +elif test "$ac_cv_sizeof_unsigned_long_long" -ne 0; then + SCM_I_GSC_T_UINTMAX='"unsigned long long"' +else + SCM_I_GSC_T_UINTMAX='"unsigned long"' +fi +AC_SUBST([SCM_I_GSC_T_UINTMAX]) + + +AC_SUBST([SCM_I_GSC_NEEDS_STDINT_H]) +AC_SUBST([SCM_I_GSC_NEEDS_INTTYPES_H]) + +AC_HEADER_STDC +AC_HEADER_TIME +AC_HEADER_SYS_WAIT +AC_HEADER_DIRENT + +# Reason for checking: +# +# HP-UX 11.11 (at least) doesn't provide `struct dirent64', even +# with `_LARGEFILE64_SOURCE', so check whether it's available. +# +AC_CHECK_MEMBER([struct dirent64.d_name], + [SCM_I_GSC_HAVE_STRUCT_DIRENT64=1], [SCM_I_GSC_HAVE_STRUCT_DIRENT64=0], + [ #ifndef _LARGEFILE64_SOURCE + # define _LARGEFILE64_SOURCE + #endif + + /* Per Autoconf manual. */ + #include + #ifdef HAVE_DIRENT_H + # include + #else + # define dirent direct + # ifdef HAVE_SYS_NDIR_H + # include + # endif + # ifdef HAVE_SYS_DIR_H + # include + # endif + # ifdef HAVE_NDIR_H + # include + # endif + #endif ]) +AC_SUBST([SCM_I_GSC_HAVE_STRUCT_DIRENT64]) + +# Reasons for testing: +# complex.h - new in C99 +# fenv.h - available in C99, but not older systems +# machine/fpu.h - on Tru64 5.1b, the declaration of fesetround(3) is in +# this file instead of +# process.h - mingw specific +# +AC_CHECK_HEADERS([complex.h fenv.h io.h libc.h limits.h malloc.h memory.h process.h string.h \ +regex.h rxposix.h rx/rxposix.h sys/dir.h sys/ioctl.h sys/select.h \ +sys/time.h sys/timeb.h sys/times.h sys/stdtypes.h sys/types.h \ +sys/utime.h time.h unistd.h utime.h pwd.h grp.h sys/utsname.h \ +direct.h strings.h machine/fpu.h]) + +# "complex double" is new in C99, and "complex" is only a keyword if +# is included +AC_CHECK_TYPES(complex double,,, +[#if HAVE_COMPLEX_H +#include +#endif]) + +# On MacOS X contains socklen_t, so must include that +# when testing. +AC_CHECK_TYPE(socklen_t, , + [AC_DEFINE_UNQUOTED(socklen_t, int, + [Define to `int' if does not define.])], + [#if HAVE_SYS_TYPES_H +#include +#endif +#include +]) +AC_CHECK_TYPE(struct ip_mreq) + +GUILE_HEADER_LIBC_WITH_UNISTD + +AC_TYPE_GETGROUPS +AC_TYPE_SIGNAL +AC_TYPE_MODE_T + +# On mingw -lm is empty, so this test is unnecessary, but it's +# harmless so we don't hard-code to suppress it. +# +AC_CHECK_LIB(m, cos) + +AC_CHECK_FUNCS(gethostbyname) +if test $ac_cv_func_gethostbyname = no; then + AC_CHECK_LIB(nsl, gethostbyname) +fi + +AC_CHECK_FUNCS(connect) +if test $ac_cv_func_connect = no; then + AC_CHECK_LIB(socket, connect) +fi + +dnl +dnl Check for Winsock and other functionality on Win32 (*not* CygWin) +dnl +EXTRA_DEFS="" +case $host in + *-*-mingw*) + AC_CHECK_HEADER(winsock2.h, [AC_DEFINE([HAVE_WINSOCK2_H], 1, + [Define if you have the header file.])]) + AC_CHECK_LIB(ws2_32, main) + AC_LIBOBJ([win32-uname]) + AC_LIBOBJ([win32-dirent]) + if test "$enable_networking" = yes ; then + AC_LIBOBJ([win32-socket]) + fi + if test "$enable_shared" = yes ; then + EXTRA_DEFS="-DSCM_IMPORT" + AC_DEFINE(USE_DLL_IMPORT, 1, + [Define if you need additional CPP macros on Win32 platforms.]) + fi + ;; +esac +AC_SUBST(EXTRA_DEFS) + +# Reasons for testing: +# crt_externs.h - Darwin specific +# +AC_CHECK_HEADERS([assert.h crt_externs.h]) + +# Reasons for testing: +# DINFINITY - OSF specific +# DQNAN - OSF specific +# (DINFINITY and DQNAN are actually global variables, not functions) +# chsize - an MS-DOS-ism, found in mingw +# cexp, clog - not in various pre-c99 systems, and note that it's possible +# for gcc to provide the "complex double" type but the system to not +# have functions like cexp and clog +# clog10 - not in mingw (though others like clog and csqrt are) +# fesetround - available in C99, but not older systems +# ftruncate - posix, but probably not older systems (current mingw +# has it as an inline for chsize) +# ioctl - not in mingw. +# gmtime_r - recent posix, not on old systems +# pipe - not in mingw +# _pipe - specific to mingw, taking 3 args +# readdir_r - recent posix, not on old systems +# readdir64_r - not available on HP-UX 11.11 +# stat64 - SuS largefile stuff, not on old systems +# sysconf - not on old systems +# truncate - not in mingw +# isblank - available as a GNU extension or in C99 +# _NSGetEnviron - Darwin specific +# +AC_CHECK_FUNCS([DINFINITY DQNAN cexp chsize clog clog10 ctermid fesetround ftime ftruncate fchown getcwd geteuid gettimeofday gmtime_r ioctl lstat mkdir mknod nice pipe _pipe readdir_r readdir64_r readlink rename rmdir select setegid seteuid setlocale setpgid setsid sigaction siginterrupt stat64 strftime strptime symlink sync sysconf tcgetpgrp tcsetpgrp times uname waitpid strdup system usleep atexit on_exit chown link fcntl ttyname getpwent getgrent kill getppid getpgrp fork setitimer getitimer strchr strcmp index bcopy memcpy rindex truncate unsetenv isblank _NSGetEnviron strncasecmp]) + +# Reasons for testing: +# netdb.h - not in mingw +# sys/param.h - not in mingw +# pthread.h - only available with pthreads. ACX_PTHREAD doesn't +# check this specifically, we need it for the timespec test below. +# sethostname - the function itself check because it's not in mingw, +# the DECL is checked because Solaris 10 doens't have in any header +# strncasecmp - on NetBSD 1.6 the symbol is available in libc but the +# declaration cannot be found +# unsetenv - on Tru64 5.1b the symbol is available in libc but the +# declaration is only found if `_BSD' is defined; it's marked as +# discouraged in and has type `void' instead of `int' +# anyway. +# hstrerror - on Tru64 5.1b the symbol is available in libc but the +# declaration isn't anywhere. +# cuserid - on Tru64 5.1b the declaration is documented to be available +# only with `_XOPEN_SOURCE' or some such. +# flock - on Tru64 5.1b the declaration is available from +# but only if `_BSD' is defined. +# vsnprintf - on AIX 5.3, the declaration is only visible with +# `_XOPEN_SOURCE >= 500' or `_ISOC99_SOURCE'. +# +AC_CHECK_HEADERS(crypt.h netdb.h pthread.h sys/param.h sys/resource.h sys/file.h) +AC_CHECK_FUNCS(chroot flock getlogin cuserid getpriority setpriority getpass sethostname gethostname) +AC_CHECK_DECLS([sethostname, strncasecmp, unsetenv, hstrerror, cuserid, flock, vsnprintf]) + +# crypt() may or may not be available, for instance in some countries there +# are restrictions on cryptography. +# +# crypt() might be in libc (eg. OpenBSD), or it might be in a separate +# -lcrypt library (eg. Debian GNU/Linux). +# +# On HP-UX 11, crypt() is in libc and there's a dummy libcrypt.a. We must +# be careful to avoid -lcrypt in this case, since libtool will see there's +# only a static libcrypt and decide to build only a static libguile. +# +# AC_SEARCH_LIBS lets us add -lcrypt to LIBS only if crypt() is not in the +# libraries already in that list. +# +AC_SEARCH_LIBS(crypt, crypt, + [AC_DEFINE(HAVE_CRYPT,1, + [Define to 1 if you have the `crypt' function.])]) + +# When compiling with GCC on some OSs (Solaris, AIX), _Complex_I doesn't +# work; in the reported cases so far, 1.0fi works well instead. According +# to the C99 spec, the complex.h header must provide a working definition +# of _Complex_I, so we always try _Complex_I first. The 1.0fi fallback +# is a workaround for the failure of some systems to conform to C99. +if test "$ac_cv_type_complex_double" = yes; then + AC_MSG_CHECKING([for i]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#if HAVE_COMPLEX_H +#include +#endif +complex double z; +]], [[ +z = _Complex_I; +]])], + [AC_DEFINE(GUILE_I,_Complex_I,[The imaginary unit (positive square root of -1).]) + AC_MSG_RESULT([_Complex_I])], + [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#if HAVE_COMPLEX_H +#include +#endif +complex double z; +]],[[ +z = 1.0fi; +]])], + [AC_DEFINE(GUILE_I,1.0fi) + AC_MSG_RESULT([1.0fi])], + [ac_cv_type_complex_double=no + AC_MSG_RESULT([not available])])]) +fi + +# glibc 2.3.6 (circa 2006) and various prior versions had a bug where +# csqrt(-i) returned a negative real part, when it should be positive +# for the principal root. +# +if test "$ac_cv_type_complex_double" = yes; then + AC_CACHE_CHECK([whether csqrt is usable], + guile_cv_use_csqrt, + [AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +/* "volatile" is meant to prevent gcc from calculating the sqrt as a + constant, we want to test libc. */ +volatile complex double z = - _Complex_I; +int +main (void) +{ + z = csqrt (z); + if (creal (z) > 0.0) + return 0; /* good */ + else + return 1; /* bad */ +}]])], + [guile_cv_use_csqrt=yes], + [guile_cv_use_csqrt="no, glibc 2.3 bug"], + [guile_cv_use_csqrt="yes, hopefully (cross-compiling)"])]) + case $guile_cv_use_csqrt in + yes*) + AC_DEFINE(HAVE_USABLE_CSQRT, 1, [Define to 1 if csqrt is bug-free]) + ;; + esac +fi + + +dnl GMP tests +AC_CHECK_LIB([gmp], [__gmpz_init], , + [AC_MSG_ERROR([GNU MP not found, see README])]) + +# mpz_import is a macro so we need to include +AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[mpz_import (0, 0, 0, 0, 0, 0, 0); ]])], + [], + [AC_MSG_ERROR([At least GNU MP 4.1 is required, see README])]) + +dnl i18n tests +#AC_CHECK_HEADERS([libintl.h]) +#AC_CHECK_FUNCS(gettext) +#if test $ac_cv_func_gettext = no; then +# AC_CHECK_LIB(intl, gettext) +#fi +#AC_CHECK_FUNCS([bindtextdomain textdomain]) +AM_GNU_GETTEXT([external], [need-ngettext]) + +### Some systems don't declare some functions. On such systems, we +### need to at least provide our own K&R-style declarations. + +### GUILE_FUNC_DECLARED(function, headerfile) + +### Check for a declaration of FUNCTION in HEADERFILE; if it is +### not there, #define MISSING_FUNCTION_DECL. +AC_DEFUN([GUILE_FUNC_DECLARED], [ + AC_CACHE_CHECK(for $1 declaration, guile_cv_func_$1_declared, + AC_EGREP_HEADER($1, $2, + guile_cv_func_$1_declared=yes, + guile_cv_func_$1_declared=no)) + if test [x$guile_cv_func_]$1[_declared] = xno; then + AC_DEFINE([MISSING_]translit($1, [a-z], [A-Z])[_DECL], 1, + [Define if the operating system supplies $1 without declaring it.]) + fi +]) + +GUILE_FUNC_DECLARED(sleep, unistd.h) +GUILE_FUNC_DECLARED(usleep, unistd.h) + +AC_CHECK_DECLS([strptime],,, +[#define _GNU_SOURCE /* ask glibc to give strptime prototype */ +#include ]) + +### On some systems usleep has no return value. If it does have one, +### we'd like to return it; otherwise, we'll fake it. +AC_CACHE_CHECK([return type of usleep], guile_cv_func_usleep_return_type, + [AC_EGREP_HEADER(changequote(<, >)changequote([, ]), + unistd.h, + [guile_cv_func_usleep_return_type=void], + [guile_cv_func_usleep_return_type=int])]) +case "$guile_cv_func_usleep_return_type" in + "void" ) + AC_DEFINE(USLEEP_RETURNS_VOID, 1, + [Define if the system headers declare usleep to return void.]) + ;; +esac + +AC_CHECK_HEADER(sys/un.h, have_sys_un_h=1) +if test -n "$have_sys_un_h" ; then + AC_DEFINE(HAVE_UNIX_DOMAIN_SOCKETS, 1, + [Define if the system supports Unix-domain (file-domain) sockets.]) +fi + +AC_CHECK_FUNCS(socketpair getgroups setgroups setpwent pause tzset) + +AC_CHECK_FUNCS(sethostent gethostent endhostent dnl + setnetent getnetent endnetent dnl + setprotoent getprotoent endprotoent dnl + setservent getservent endservent dnl + getnetbyaddr getnetbyname dnl + inet_lnaof inet_makeaddr inet_netof hstrerror dnl + inet_pton inet_ntop) + +# struct sockaddr field sin_len is only present on BSD systems. +# On 4.4BSD apparently a #define SIN_LEN exists, but on other BSD systems +# (eg. FreeBSD 4.9) it doesn't and we must use this configure check +AC_CHECK_MEMBERS([struct sockaddr.sin_len],,, +[#ifdef HAVE_SYS_TYPES_H +#include +#endif +#include ]) + +AC_MSG_CHECKING(for __libc_stack_end) +AC_CACHE_VAL(guile_cv_have_libc_stack_end, +[AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include +extern char *__libc_stack_end;]], + [[printf("%p", (char*) __libc_stack_end);]])], + [guile_cv_have_libc_stack_end=yes], + [guile_cv_have_libc_stack_end=no])]) +AC_MSG_RESULT($guile_cv_have_libc_stack_end) + +if test $guile_cv_have_libc_stack_end = yes; then + AC_DEFINE(HAVE_LIBC_STACK_END, 1, + [Define if you have the __libc_stack_end variable.]) +fi + +dnl Some systems do not declare this. Some systems do declare it, as a +dnl macro. With cygwin it may be in a DLL. + +AC_MSG_CHECKING(whether netdb.h declares h_errno) +AC_CACHE_VAL(guile_cv_have_h_errno, + [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[int a = h_errno;]])], + [guile_cv_have_h_errno=yes], + [guile_cv_have_h_errno=no])]) +AC_MSG_RESULT($guile_cv_have_h_errno) +if test $guile_cv_have_h_errno = yes; then + AC_DEFINE(HAVE_H_ERRNO, 1, [Define if h_errno is declared in netdb.h.]) +fi + +AC_MSG_CHECKING(whether uint32_t is defined) +AC_CACHE_VAL(guile_cv_have_uint32_t, + [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include + #if HAVE_STDINT_H + #include + #endif + #ifndef HAVE_NETDB_H + #include + #endif]], + [[uint32_t a;]])], + [guile_cv_have_uint32_t=yes], + [guile_cv_have_uint32_t=no])]) +AC_MSG_RESULT($guile_cv_have_uint32_t) +if test $guile_cv_have_uint32_t = yes; then + AC_DEFINE(HAVE_UINT32_T, 1, + [Define if uint32_t typedef is defined when netdb.h is include.]) +fi + +AC_MSG_CHECKING(for working IPv6 support) +AC_CACHE_VAL(guile_cv_have_ipv6, +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#include +#include ]], +[[struct sockaddr_in6 a; a.sin6_family = AF_INET6;]])], +[guile_cv_have_ipv6=yes], +[guile_cv_have_ipv6=no])]) +AC_MSG_RESULT($guile_cv_have_ipv6) +if test $guile_cv_have_ipv6 = yes; then + AC_DEFINE(HAVE_IPV6, 1, [Define if you want support for IPv6.]) +fi + +# included in rfc2553 but not in older implementations, e.g., glibc 2.1.3. +AC_MSG_CHECKING(whether sockaddr_in6 has sin6_scope_id) +AC_CACHE_VAL(guile_cv_have_sin6_scope_id, +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#include ]], +[[struct sockaddr_in6 sok; sok.sin6_scope_id = 0;]])], +[guile_cv_have_sin6_scope_id=yes], +[guile_cv_have_sin6_scope_id=no])]) +AC_MSG_RESULT($guile_cv_have_sin6_scope_id) +if test $guile_cv_have_sin6_scope_id = yes; then + AC_DEFINE(HAVE_SIN6_SCOPE_ID, 1, + [Define this if your IPv6 has sin6_scope_id in sockaddr_in6 struct.]) +fi + +# struct sockaddr_in6 field sin_len is only present on BSD systems +AC_CHECK_MEMBERS([struct sockaddr_in6.sin6_len],,, +[#ifdef HAVE_SYS_TYPES_H +#include +#endif +#include ]) + +AC_MSG_CHECKING(whether localtime caches TZ) +AC_CACHE_VAL(guile_cv_localtime_cache, +[if test x$ac_cv_func_tzset = xyes; then +AC_RUN_IFELSE([AC_LANG_SOURCE([[#include +#if STDC_HEADERS +# include +#endif +extern char **environ; +unset_TZ () +{ + char **from, **to; + for (to = from = environ; (*to = *from); from++) + if (! (to[0][0] == 'T' && to[0][1] == 'Z' && to[0][2] == '=')) + to++; +} +char TZ_GMT0[] = "TZ=GMT0"; +char TZ_PST8[] = "TZ=PST8"; +main() +{ + time_t now = time ((time_t *) 0); + int hour_GMT0, hour_unset; + if (putenv (TZ_GMT0) != 0) + exit (1); + hour_GMT0 = localtime (&now)->tm_hour; + unset_TZ (); + hour_unset = localtime (&now)->tm_hour; + if (putenv (TZ_PST8) != 0) + exit (1); + if (localtime (&now)->tm_hour == hour_GMT0) + exit (1); + unset_TZ (); + if (localtime (&now)->tm_hour != hour_unset) + exit (1); + exit (0); +}]])], +[guile_cv_localtime_cache=no], +[guile_cv_localtime_cache=yes], +[# If we have tzset, assume the worst when cross-compiling. +guile_cv_localtime_cache=yes]) +else + # If we lack tzset, report that localtime does not cache TZ, + # since we can't invalidate the cache if we don't have tzset. + guile_cv_localtime_cache=no +fi])dnl +AC_MSG_RESULT($guile_cv_localtime_cache) +if test $guile_cv_localtime_cache = yes; then + AC_DEFINE(LOCALTIME_CACHE, 1, [Define if localtime caches the TZ setting.]) +fi + +if test "$enable_regex" = yes; then + if test "$ac_cv_header_regex_h" = yes || + test "$ac_cv_header_rxposix_h" = yes || + test "$ac_cv_header_rx_rxposix_h" = yes; then + GUILE_NAMED_CHECK_FUNC(regcomp, norx, [AC_LIBOBJ([regex-posix])], + [AC_CHECK_LIB(rx, main) + GUILE_NAMED_CHECK_FUNC(regcomp, rx, [AC_LIBOBJ([regex-posix])], + [AC_CHECK_LIB(regex, main) + GUILE_NAMED_CHECK_FUNC(regcomp, regex, [AC_LIBOBJ([regex-posix])])])] + ) + dnl The following should not be necessary, but for some reason + dnl autoheader misses it if we don't include it! + if test "$ac_cv_func_regcomp_norx" = yes || + test "$ac_cv_func_regcomp_regex" = yes || + test "$ac_cv_func_regcomp_rx" = yes; then + AC_DEFINE(HAVE_REGCOMP, 1, + [This is included as part of a workaround for a autoheader bug.]) + fi + fi +fi + +AC_REPLACE_FUNCS(inet_aton putenv strerror memmove mkstemp) + +AC_CHECK_HEADERS(floatingpoint.h ieeefp.h nan.h) + +# Reasons for testing: +# asinh, acosh, atanh, trunc - C99 standard, generally not available on +# older systems +# sincos - GLIBC extension +# +AC_CHECK_FUNCS(asinh acosh atanh copysign finite sincos trunc) + +# C99 specifies isinf and isnan as macros. +# HP-UX provides only macros, no functions. +# glibc 2.3.2 provides both macros and functions. +# IRIX 6.5 and Solaris 8 only provide functions. +# +# The following tests detect isinf and isnan either as functions or as +# macros from . Plain AC_CHECK_FUNCS is insufficient, it doesn't +# use so doesn't detect on macro-only systems like HP-UX. +# +AC_MSG_CHECKING([for isinf]) +AC_LINK_IFELSE(AC_LANG_SOURCE( +[[#include +volatile double x = 0.0; +int main () { return (isinf(x) != 0); }]]), + [AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE_ISINF, 1, + [Define to 1 if you have the `isinf' macro or function.])], + [AC_MSG_RESULT([no])]) +AC_MSG_CHECKING([for isnan]) +AC_LINK_IFELSE(AC_LANG_SOURCE( +[[#include +volatile double x = 0.0; +int main () { return (isnan(x) != 0); }]]), + [AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE_ISNAN, 1, + [Define to 1 if you have the `isnan' macro or function.])], + [AC_MSG_RESULT([no])]) + +# We must have a proper stack-using alloca in order for stack-copying +# continuations to work properly. If we don't find a native one, +# abort. + +AC_FUNC_ALLOCA +if test "$ALLOCA" = "alloca.o" +then + AC_ERROR([No native alloca found.]) +fi + +# Reasons for checking: +# +# st_rdev +# st_blksize +# st_blocks not in mingw +# tm_gmtoff BSD+GNU, not in C99 +# +# Note AC_STRUCT_ST_BLOCKS is not used here because we don't want the +# AC_LIBOBJ(fileblocks) replacement which that macro gives. +# +AC_CHECK_MEMBERS([struct stat.st_rdev, struct stat.st_blksize, struct stat.st_blocks]) + +AC_STRUCT_TIMEZONE +AC_CHECK_MEMBERS([struct tm.tm_gmtoff],,, +[#include +#ifdef TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif +]) +GUILE_STRUCT_UTIMBUF + + +#-------------------------------------------------------------------- +# +# Which way does the stack grow? +# +# Following code comes from Autoconf 2.61's internal _AC_LIBOBJ_ALLOCA +# macro (/usr/share/autoconf/autoconf/functions.m4). Gnulib has +# very similar code, so in future we could look at using that. +# +# An important detail is that the code involves find_stack_direction +# calling _itself_ - which means that find_stack_direction (or at +# least the second find_stack_direction() call) cannot be inlined. +# If the code could be inlined, that might cause the test to give +# an incorrect answer. +#-------------------------------------------------------------------- + +SCM_I_GSC_STACK_GROWS_UP=0 +AC_RUN_IFELSE([AC_LANG_SOURCE( +[AC_INCLUDES_DEFAULT +int +find_stack_direction () +{ + static char *addr = 0; + auto char dummy; + if (addr == 0) + { + addr = &dummy; + return find_stack_direction (); + } + else + return (&dummy > addr) ? 1 : -1; +} + +int +main () +{ + return find_stack_direction () < 0; +}])], + [SCM_I_GSC_STACK_GROWS_UP=1], + [], + [AC_MSG_WARN(Guessing that stack grows down -- see scmconfig.h)]) + +AC_CHECK_SIZEOF(float) +if test "$ac_cv_sizeof_float" -le "$ac_cv_sizeof_long"; then + AC_DEFINE(SCM_SINGLES, 1, + [Define this if floats are the same size as longs.]) +fi + +AC_MSG_CHECKING(for struct linger) +AC_CACHE_VAL(scm_cv_struct_linger, + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#include +#include ]], + [[struct linger lgr; lgr.l_linger = 100]])], + [scm_cv_struct_linger="yes"], + [scm_cv_struct_linger="no"])) +AC_MSG_RESULT($scm_cv_struct_linger) +if test $scm_cv_struct_linger = yes; then + AC_DEFINE(HAVE_STRUCT_LINGER, 1, + [Define this if your system defines struct linger, for use with the + getsockopt and setsockopt system calls.]) +fi + + +# On mingw, struct timespec is in . +# +AC_MSG_CHECKING(for struct timespec) +AC_CACHE_VAL(scm_cv_struct_timespec, + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#include +#if HAVE_PTHREAD_H +#include +#endif]], [[struct timespec t; t.tv_nsec = 100]])], + [scm_cv_struct_timespec="yes"], + [scm_cv_struct_timespec="no"])) +AC_MSG_RESULT($scm_cv_struct_timespec) +if test $scm_cv_struct_timespec = yes; then + AC_DEFINE(HAVE_STRUCT_TIMESPEC, 1, + [Define this if your system defines struct timespec via either or .]) +fi + +#-------------------------------------------------------------------- +# +# Flags for thread support +# +#-------------------------------------------------------------------- + +SCM_I_GSC_USE_PTHREAD_THREADS=0 +SCM_I_GSC_USE_NULL_THREADS=0 +AC_SUBST([SCM_I_GSC_USE_PTHREAD_THREADS]) +AC_SUBST([SCM_I_GSC_USE_NULL_THREADS]) + +### What thread package has the user asked for? +AC_ARG_WITH(threads, [ --with-threads thread interface], + , with_threads=yes) + +AC_SUBST(SCM_I_GSC_NEED_BRACES_ON_PTHREAD_ONCE_INIT, 0) +AC_SUBST(SCM_I_GSC_NEED_BRACES_ON_PTHREAD_MUTEX_INITIALIZER, 0) + +case "$with_threads" in + "yes" | "pthread" | "pthreads" | "pthread-threads" | "") + + build_pthread_support="yes" + + ACX_PTHREAD([CC="$PTHREAD_CC" + LIBS="$PTHREAD_LIBS $LIBS" + SCM_I_GSC_USE_PTHREAD_THREADS=1 + with_threads="pthreads"], + [with_threads="null" + build_pthread_support="no"]) + + old_CFLAGS="$CFLAGS" + CFLAGS="$PTHREAD_CFLAGS $CFLAGS" + + # Reasons for testing: + # pthread_getattr_np - "np" meaning "non portable" says it + # all; not present on MacOS X or Solaris 10 + # pthread_get_stackaddr_np - "np" meaning "non portable" says it + # all; specific to MacOS X + # pthread_sigmask - not available on mingw + # + AC_CHECK_FUNCS(pthread_attr_getstack pthread_getattr_np pthread_get_stackaddr_np pthread_sigmask) + + # On past versions of Solaris, believe 8 through 10 at least, you + # had to write "pthread_once_t foo = { PTHREAD_ONCE_INIT };". + # This is contrary to POSIX: + # http://www.opengroup.org/onlinepubs/000095399/functions/pthread_once.html + # Check here if this style is required. + # + # glibc (2.3.6 at least) works both with or without braces, so the + # test checks whether it works without. + # + + if test "$GCC" = "yes"; then + # Since GCC only issues a warning for missing braces, so we need + # `-Werror' to catch it. + CFLAGS="-Werror -Wmissing-braces $CFLAGS" + fi + + AC_CACHE_CHECK([whether PTHREAD_ONCE_INIT needs braces], + guile_cv_need_braces_on_pthread_once_init, + [AC_COMPILE_IFELSE([#include + pthread_once_t foo = PTHREAD_ONCE_INIT;], + [guile_cv_need_braces_on_pthread_once_init=no], + [guile_cv_need_braces_on_pthread_once_init=yes])]) + if test "$guile_cv_need_braces_on_pthread_once_init" = yes; then + SCM_I_GSC_NEED_BRACES_ON_PTHREAD_ONCE_INIT=1 + fi + + # Same problem with `PTHREAD_MUTEX_INITIALIZER', e.g., on IRIX + # 6.5.30m with GCC 3.3. + AC_CACHE_CHECK([whether PTHREAD_MUTEX_INITIALIZER needs braces], + guile_cv_need_braces_on_pthread_mutex_initializer, + [AC_COMPILE_IFELSE([#include + pthread_mutex_t foo = PTHREAD_MUTEX_INITIALIZER;], + [guile_cv_need_braces_on_pthread_mutex_initializer=no], + [guile_cv_need_braces_on_pthread_mutex_initializer=yes])]) + if test "$guile_cv_need_braces_on_pthread_mutex_initializer" = yes; then + SCM_I_GSC_NEED_BRACES_ON_PTHREAD_MUTEX_INITIALIZER=1 + fi + + CFLAGS="$old_CFLAGS" + + # On Solaris, sched_yield lives in -lrt. + AC_SEARCH_LIBS(sched_yield, rt) + + ;; +esac + +case "$with_threads" in + "pthreads") + ;; + "no" | "null") + SCM_I_GSC_USE_NULL_THREADS=1 + with_threads="null-threads" + ;; + * ) + AC_MSG_ERROR(invalid value for --with-threads: $with_threads) + ;; +esac + +AC_MSG_CHECKING(what kind of threads to support) +AC_MSG_RESULT($with_threads) + +AM_CONDITIONAL([BUILD_PTHREAD_SUPPORT], + [test "x$build_pthread_support" = "xyes"]) + + +## Check whether pthread_attr_getstack works for the main thread + +if test "$with_threads" = pthreads; then + +AC_MSG_CHECKING(whether pthread_attr_getstack works for the main thread) +old_CFLAGS="$CFLAGS" +CFLAGS="$PTHREAD_CFLAGS $CFLAGS" +AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#if HAVE_PTHREAD_ATTR_GETSTACK +#include + +int main () +{ + pthread_attr_t attr; + void *start, *end; + size_t size; + + pthread_getattr_np (pthread_self (), &attr); + pthread_attr_getstack (&attr, &start, &size); + end = (char *)start + size; + + if ((void *)&attr < start || (void *)&attr >= end) + return 1; + else + return 0; +} +#else +int main () +{ + return 1; +} +#endif +]])], +[works=yes +AC_DEFINE(PTHREAD_ATTR_GETSTACK_WORKS, [1], [Define when pthread_att_get_stack works for the main thread])], +[works=no], +[]) +CFLAGS="$old_CFLAGS" +AC_MSG_RESULT($works) + +fi # with_threads=pthreads + + +## Cross building +if test "$cross_compiling" = "yes"; then + AC_MSG_CHECKING(cc for build) + ## /usr/bin/cc still uses wrong assembler + ## CC_FOR_BUILD="${CC_FOR_BUILD-/usr/bincc}" + CC_FOR_BUILD="${CC_FOR_BUILD-PATH=/usr/bin:$PATH cc}" +else + CC_FOR_BUILD="${CC_FOR_BUILD-$CC}" +fi + +## AC_MSG_CHECKING("if we are cross compiling") +## AC_MSG_RESULT($cross_compiling) +if test "$cross_compiling" = "yes"; then + AC_MSG_RESULT($CC_FOR_BUILD) +fi + +## No need as yet to be more elaborate +CCLD_FOR_BUILD="$CC_FOR_BUILD" + +AC_SUBST(cross_compiling) +AC_ARG_VAR(CC_FOR_BUILD,[build system C compiler]) +AC_SUBST(CCLD_FOR_BUILD) + +## libtool erroneously calls CC_FOR_BUILD HOST_CC; +## --HOST is the platform that PACKAGE is compiled for. +HOST_CC="$CC_FOR_BUILD" +AC_SUBST(HOST_CC) + +if test "$cross_compiling" = "yes"; then + AC_MSG_CHECKING(guile for build) + GUILE_FOR_BUILD="${GUILE_FOR_BUILD-guile}" +else + GUILE_FOR_BUILD='$(preinstguile)' +fi + +## AC_MSG_CHECKING("if we are cross compiling") +## AC_MSG_RESULT($cross_compiling) +if test "$cross_compiling" = "yes"; then + AC_MSG_RESULT($GUILE_FOR_BUILD) +fi +AC_ARG_VAR(GUILE_FOR_BUILD,[guile for build system]) +AC_SUBST(GUILE_FOR_BUILD) + +## If we're using GCC, ask for aggressive warnings. +case "$GCC" in + yes ) + ## We had -Wstrict-prototypes in here for a bit, but Guile does too + ## much stuff with generic function pointers for that to really be + ## less than exasperating. + ## -Wpointer-arith was here too, but something changed in gcc/glibc + ## and it became equally exasperating (gcc 2.95 and/or glibc 2.1.2). + CFLAGS="$CFLAGS -Wall -Wmissing-prototypes" + # Do this here so we don't screw up any of the tests above that might + # not be "warning free" + if test "${GUILE_ERROR_ON_WARNING}" = yes + then + CFLAGS="${CFLAGS} -Werror" + enable_compile_warnings=no + fi + ;; +esac + +## If we're creating a shared library (using libtool!), then we'll +## need to generate a list of .lo files corresponding to the .o files +## given in LIBOBJS. We'll call it LIBLOBJS. +LIBLOBJS="`echo ${LIB@&t@OBJS} | sed 's,\.[[^.]]* ,.lo ,g;s,\.[[^.]]*$,.lo,'`" + +## We also need to create corresponding .doc and .x files +EXTRA_DOT_DOC_FILES="`echo ${LIB@&t@OBJS} | sed 's,\.[[^.]]* ,.doc ,g;s,\.[[^.]]*$,.doc,'`" +EXTRA_DOT_X_FILES="`echo ${LIB@&t@OBJS} | sed 's,\.[[^.]]* ,.x ,g;s,\.[[^.]]*$,.x,'`" + +AC_SUBST(GUILE_MAJOR_VERSION) +AC_SUBST(GUILE_MINOR_VERSION) +AC_SUBST(GUILE_MICRO_VERSION) +AC_SUBST(GUILE_EFFECTIVE_VERSION) +AC_SUBST(GUILE_VERSION) + +####################################################################### +# library versioning + +AC_SUBST(LIBGUILE_INTERFACE_CURRENT) +AC_SUBST(LIBGUILE_INTERFACE_REVISION) +AC_SUBST(LIBGUILE_INTERFACE_AGE) +AC_SUBST(LIBGUILE_INTERFACE) + +AC_SUBST(LIBGUILE_SRFI_SRFI_1_MAJOR) +AC_SUBST(LIBGUILE_SRFI_SRFI_1_INTERFACE_CURRENT) +AC_SUBST(LIBGUILE_SRFI_SRFI_1_INTERFACE_REVISION) +AC_SUBST(LIBGUILE_SRFI_SRFI_1_INTERFACE_AGE) +AC_SUBST(LIBGUILE_SRFI_SRFI_1_INTERFACE) + +AC_SUBST(LIBGUILE_SRFI_SRFI_4_MAJOR) +AC_SUBST(LIBGUILE_SRFI_SRFI_4_INTERFACE_CURRENT) +AC_SUBST(LIBGUILE_SRFI_SRFI_4_INTERFACE_REVISION) +AC_SUBST(LIBGUILE_SRFI_SRFI_4_INTERFACE_AGE) +AC_SUBST(LIBGUILE_SRFI_SRFI_4_INTERFACE) + +AC_SUBST(LIBGUILE_SRFI_SRFI_13_14_MAJOR) +AC_SUBST(LIBGUILE_SRFI_SRFI_13_14_INTERFACE_CURRENT) +AC_SUBST(LIBGUILE_SRFI_SRFI_13_14_INTERFACE_REVISION) +AC_SUBST(LIBGUILE_SRFI_SRFI_13_14_INTERFACE_AGE) +AC_SUBST(LIBGUILE_SRFI_SRFI_13_14_INTERFACE) + +AC_SUBST(LIBGUILE_SRFI_SRFI_60_MAJOR) +AC_SUBST(LIBGUILE_SRFI_SRFI_60_INTERFACE_CURRENT) +AC_SUBST(LIBGUILE_SRFI_SRFI_60_INTERFACE_REVISION) +AC_SUBST(LIBGUILE_SRFI_SRFI_60_INTERFACE_AGE) +AC_SUBST(LIBGUILE_SRFI_SRFI_60_INTERFACE) + +####################################################################### + +dnl Tell guile-config what flags guile users should compile and link with. +GUILE_LIBS="$LDFLAGS $LIBS" +GUILE_CFLAGS="$CPPFLAGS $PTHREAD_CFLAGS" +AC_SUBST(GUILE_LIBS) +AC_SUBST(GUILE_CFLAGS) + +AC_SUBST(AWK) +AC_SUBST(LIBLOBJS) +AC_SUBST(EXTRA_DOT_DOC_FILES) +AC_SUBST(EXTRA_DOT_X_FILES) + +dnl See also top_builddir in info node: (libtool)AC_PROG_LIBTOOL +top_builddir_absolute=`pwd` +AC_SUBST(top_builddir_absolute) +top_srcdir_absolute=`(cd $srcdir && pwd)` +AC_SUBST(top_srcdir_absolute) + +dnl We need `sitedir' in `guile-1.8.pc'. +dnl Note: `sitedir' must be kept in sync with `GUILE_SITE_DIR' in `guile.m4'. +pkgdatadir="$datadir/guile" +sitedir="$pkgdatadir/site" +AC_SUBST([sitedir]) + +# Additional SCM_I_GSC definitions are above. +AC_SUBST([SCM_I_GSC_GUILE_DEBUG]) +AC_SUBST([SCM_I_GSC_GUILE_DEBUG_FREELIST]) +AC_SUBST([SCM_I_GSC_ENABLE_DISCOURAGED]) +AC_SUBST([SCM_I_GSC_ENABLE_DEPRECATED]) +AC_SUBST([SCM_I_GSC_ENABLE_ELISP]) +AC_SUBST([SCM_I_GSC_STACK_GROWS_UP]) +AC_SUBST([SCM_I_GSC_C_INLINE]) +AC_CONFIG_FILES([libguile/gen-scmconfig.h]) + +AC_CONFIG_FILES([ + Makefile + am/Makefile + benchmark-suite/Makefile + doc/Makefile + doc/goops/Makefile + doc/r5rs/Makefile + doc/ref/Makefile + doc/tutorial/Makefile + emacs/Makefile + examples/Makefile + guile-config/Makefile + ice-9/Makefile + lang/Makefile + libguile/Makefile + oop/Makefile + oop/goops/Makefile + scripts/Makefile + srfi/Makefile + test-suite/Makefile + test-suite/standalone/Makefile +]) + +AC_CONFIG_FILES([guile-1.8.pc]) +AC_CONFIG_FILES([check-guile], [chmod +x check-guile]) +AC_CONFIG_FILES([benchmark-guile], [chmod +x benchmark-guile]) +AC_CONFIG_FILES([guile-tools], [chmod +x guile-tools]) +AC_CONFIG_FILES([pre-inst-guile], [chmod +x pre-inst-guile]) +AC_CONFIG_FILES([pre-inst-guile-env], [chmod +x pre-inst-guile-env]) +AC_CONFIG_FILES([libguile/guile-snarf], + [chmod +x libguile/guile-snarf]) +AC_CONFIG_FILES([libguile/guile-doc-snarf], + [chmod +x libguile/guile-doc-snarf]) +AC_CONFIG_FILES([libguile/guile-func-name-check], + [chmod +x libguile/guile-func-name-check]) +AC_CONFIG_FILES([libguile/guile-snarf-docs], + [chmod +x libguile/guile-snarf-docs]) +AC_CONFIG_FILES([test-suite/standalone/test-use-srfi], + [chmod +x test-suite/standalone/test-use-srfi]) +AC_CONFIG_FILES([test-suite/standalone/test-fast-slot-ref], + [chmod +x test-suite/standalone/test-fast-slot-ref]) + +AC_OUTPUT + +dnl Local Variables: +dnl comment-start: "dnl " +dnl comment-end: "" +dnl comment-start-skip: "\\bdnl\\b\\s *" +dnl End: diff --git a/guile18/doc/.gitignore b/guile18/doc/.gitignore new file mode 100644 index 0000000000..ecbb7fc6d4 --- /dev/null +++ b/guile18/doc/.gitignore @@ -0,0 +1 @@ +stamp-vti diff --git a/guile18/doc/ChangeLog-2008 b/guile18/doc/ChangeLog-2008 new file mode 100644 index 0000000000..4153ad8739 --- /dev/null +++ b/guile18/doc/ChangeLog-2008 @@ -0,0 +1,996 @@ +2008-04-26 Ludovic Courtès + + * Makefile.am (EXAMPLE_SMOB_FILES): Remove `COPYING'. + +2008-01-22 Neil Jerram + + * COPYING: Removed. + + * oldfmt.c: Update copyright statement to LGPL. + +2002-09-14 Rob Browning + + * .cvsignore: add stamp-vti.1 + +2002-08-24 Marius Vollmer + + * Makefile.am (EXTRA_DIST): Do not distribute guile-api.alist, it + can't be built currently. + +2002-05-13 Thien-Thi Nguyen + + * Makefile.am (EXTRA_DIST): New var. + +2002-05-11 Thien-Thi Nguyen + + * Makefile.am: Include ../am/maintainer-dirs (in MAINTAINER_MODE). + (guile-api.alist, guile-api.alist-FORCE): + New rules (in MAINTAINER_MODE). + +2002-05-09 Thien-Thi Nguyen + + * groupings.alist: Add copyright and commentary. + + (favorite): Delete this example composite. + (embedded-libltdl, gdb, coop, gh, g-fdes, r-fdes, scm, k, POSIX, + guile-C-API): New groups. + +2002-05-08 Thien-Thi Nguyen + + * groupings.alist: New file. + +2002-04-23 Thien-Thi Nguyen + + * guile-api.alist: Update. + +2002-04-16 Marius Vollmer + + * Makefile.am (dist-hook): Simplified to not use "cd"; now it + works for relative pathnames in $(distdir). + +2002-04-10 Rob Browning + + * .cvsignore: add version-tutorial.texi, version.texi, and + stamp-vti1. + +2002-03-01 Thien-Thi Nguyen + + * guile-api.alist: Update. + +2001-08-27 Neil Jerram + + * mltext.texi (Guile Character Properties): Fix `hexidecimal' + spelling errors (merge from stable branch). + + * AUTHORS: Removed. Authorship information for each manual is now + in the top-level Texinfo file for that manual. + +2001-08-24 Neil Jerram + + * Makefile.am: Split documentation into per-manual subdirectories. + +2001-08-22 Mikael Djurfeldt + + * scheme-options.texi (Evaluator trap options): Splitted + section "Evaluator options". + + * scheme-evaluation.texi (Evaluator Behaviour): Typo "reader + options" --> "evaluator options". + +2001-08-17 Rob Browning + + * Makefile.am (guile_tut_TEXINFOS): remove guile-tut.texi. It's + already in info_TEXINFOS. + + * .cvsignore: rename stamp-vti1 to stamp-vti.1. Of course this + only matters once you fix the bug in automake. + +2001-08-02 Neil Jerram + + * scheme-debug.texi (Debugging): Improve `make-stack' doc by + explaining cutting args. + +2001-07-19 Rob Browning + + * posix.texi (Signals): add docs for setitimer and getitimer. + +2001-07-11 Gary Houston + + * scheme-evaluation.texi: Added `load-from-path'. Corrected `load': + it doesn't use the load paths. + +2001-07-04 Martin Grabmueller + + * scheme-data.texi (Hook Reference): Removed documentation for + `make-hook-with-name', which does note exist. Added note about + unspecified return values to all procedure documentation + +2001-07-02 Martin Grabmueller + + * srfi-modules.texi (SRFI-1 Fold and Map): Documented extended + versions of `map' and `for-each'. + +2001-06-30 Martin Grabmueller + + * preface.texi (Manual Conventions): Added description of + @result{} and @print{}. + + * scheme-data.texi (Hash Table Examples): New subsubsection. + +2001-06-30 Martin Grabmueller + + * scheme-data.texi (Hash Tables): Added docs for + `make-hash-table'. + +2001-06-29 Martin Grabmueller + + * misc-modules.texi: New file. + (Pretty Printing): New chapter. + (Formatted Output): New chapter. + + * Makefile.am (guile_TEXINFOS): Added misc-modules.texi. + + * guile.texi (Top): Added inclusion of misc-modules.texi. + + * scheme-modules.texi (Included Guile Modules): Added (srfi + srfi-4) and (ice-9 rw) modules. + (Module System Quirks): Removed note that `module-export!' must be + called via gh_eval_str, now that we have scm_c_export. + + * repl-modules.texi (Loading Readline Support, Readline Options): + New nodes. + +2001-06-27 Neil Jerram + + * posix.texi (Network Sockets and Communication): Grammar fix - + thanks to Christopher Cramer! + +2001-06-27 Martin Grabmueller + + * srfi-modules.texi (SRFI-4): Added documentation for the new + module (srfi srfi-4). + +2001-06-26 Neil Jerram + + * gh.texi (scm transition summary): Refer to scm_mem2string + instead of scm_makfromstr. + +2001-06-26 Dirk Herrmann + + * oldfmt.c (scm_oldfmt): Use scm_mem2string instead of + scm_makfromstr. + +2001-06-25 Neil Jerram + + * gh.texi (GH deprecation): Remove paragraph about portability. + + * extend.texi (Libguile Intro): Updated following Marius' + suggestions. + +2001-06-25 Marius Vollmer + + * Makefile.am (version.texi, version-tutorial.texi): Removed + kluges to build them unconditionally. + +2001-06-22 Neil Jerram + + * gh.texi (scm transition summary): New node for summary of how to + transition from GH to scm interface. + (GH): Link to new node. + (Calling Scheme procedures from C): Remove doc for gh_set_car and + gh_set_cdr, which don't actually exist. + (Data types and constants defined by gh): Correct + SCM_UNSPECIFIED/SCM_UNDEFINED confusion. + (Calling Scheme procedures from C): Correct SCM_EOL/SCM_UNDEFINED + confusion. + +2001-06-20 Neil Jerram + + * guile.texi (Top): Move GH chapter to end of Part V. + + * extend.texi (Libguile Intro), gh.texi (GH deprecation): Explain + deprecation of GH and broad plan for documentation of scm + interface. + +2001-06-18 Martin Grabmueller + + * srfi-modules.texi (SRFI-1): Completed procedure documentation. + + * scheme-data.texi (List Constructors): Added make-list. + Added type index entries for all data types. + +2001-06-15 Martin Grabmueller + + * srfi-modules.texi (SRFI-1): New section documenting the SRFI-1 + module. + +2001-06-14 Martin Grabmueller + + * scheme-modules.texi (Included Guile Modules): Added reference to + (srfi srfi-1) module. + +2001-06-16 Marius Vollmer + + * posix.texi (Conventions): Use `system-error-errno' instead of + explicit code + +2001-06-04 Gary Houston + + * scheme-io.texi (Block Reading and Writing): added + write-string/partial, updated read-string!/partial. + +2001-05-30 Martin Grabmueller + + * General: A lot of typo, texinfo markup and layout corrections. + + * scheme-data.texi (Arithmetic): Clarified docs for - and /. + (String Modification): Removed docs for C functions + (scm_substring_move_right_x etc.) + (Keyword Procedures): New section documenting the keyword + procedures from boot-9.scm. + (Vectors): Moved the section before the non-standard data types. + + * data-rep.texi (Defining New Types (Smobs)): Adapted description + of smobs and proocedure creation to new terminology. + (Describing a New Type): Removed mentioning of + scm_make_smob_type_mfpe from smob function list and added + deprecation notice for this function. + (Creating Instances): Added description and macro docs for smobs + with 2 or 3 data cells. + (Garbage Collecting Smobs): Removed old docs for SCM_GCTYP16. + (Garbage Collecting Simple Smobs): Added some clarification about + usage and usefulness. + (Non-immediate Datatypes): Changed R4RS reference to R5RS. + (Vector Data): Document type-specific accessors. + + +2001-05-23 Martin Grabmueller + + * guile.texi: Commented out menu entry and inclusion of Tcl/Tk + stuff. + + * indices.texi: Users are advised to look under C and Scheme + names, xref to transformation rules added. + + * intro.texi, scheme-modules.texi, scheme-ideas.texi, + scheme-evaluation.texi, scheme-data.texi, scheme-procedures.texi: + Fixed most REFFIXMEs. + + * srfi-modules.texi (About SRFI Usage): New node. + (SRFI-0): Extended. + Fixed all REFFIXMEs. + +2001-05-19 Neil Jerram + + * posix.texi (Networking): Split existing material into new nodes + `Network Address Conversion' and `Network Databases'. + + * scheme-control.texi (Lazy Catch): Update doc for new constraint + that lazy-catch handlers are not allowed to return. + +2001-05-16 Rob Browning + + * scheme-options.texi (Install Config): fixed minor-version docs + and added micro-version docs. + +2001-05-16 Neil Jerram + + * data-rep.texi, srfi-modules.texi (SRFI-14 Iterating Over + Character Sets), scheme-io.texi (Block Reading and Writing), + scheme-control.texi (Lazy Catch), scheme-procedures.texi (Internal + Macros): Add @bullet to @itemize usages. (Thanks for Masao + Uebayashi for the bug report!) + +2001-05-15 Martin Grabmueller + + * scripts.texi (Invoking Guile): Added docs for --use-srfi. + + * expect.texi, repl-modules.texi: Start the chapters with a new + page. + + * srfi-modules.texi (SRFI-0): Added note about supported feature + identifiers and an example. Start the chapter with a new page. + + * srfi-modules.texi, scheme-data.texi, scheme-control.texi, + scheme-binding.texi, repl-modules.texi, posix.texi, intro.texi, + scheme-utility.texi: Change `--' to `-' throughout. + +2001-05-14 Martin Grabmueller + + * srfi-13-14.texi: Removed. + + * srfi-modules.texi (SRFI-13): Merged SRFI-13 docs into SRFI + chapter. + (SRFI-14): Merged SRFI-14 too. + + * guile.texi (Top): Remove inclusion of obsolete SRFI-13/14 file. + + * srfi-modules.texi (SRFI-0): New section. + (SRFI-16): New section. + + Change `--' to `-' throughout. + +2001-05-13 Thien-Thi Nguyen + + * intro.texi, scheme-modules.texi, scheme-procedures.texi: + Fixup some module-related references. + + * scheme-modules.texi (Modules): Remove "babbling" fixme. + (The Guile module system): Rewrite intro. + (General Information about Modules): Rewrite some parts. + Move problems to "Module System Quirks". + (Using Guile Modules): Renamed from "Loading Guile Modules". + Rewrite most parts. + Remove reivewme comment. + (Creating Guile Modules): Review, touch up. + Remove "Tkintr" comment. + (Module System Quirks): New node/subsection. + +2001-05-06 Thien-Thi Nguyen + + * intro.texi (Using Guile Modules): Review; remove reviewme + comment. Expand `GUILE_LOAD_PATH' blurb; add small example. + (Reporting Bugs): Review; remove reviewme comment. + Reword some phrases; add texi markup. + Add suggestion to include `guile-config info' output. + Update gdb invocation; add fixme question. + +2001-05-05 Neil Jerram + + * AUTHORS: Added Martin Grabmueller. + + * scheme-procedures.texi (Macros, Syntax Rules, Internal Macros): + New material. + (Syntax Case): New node, but currently empty. + + * scheme-data.texi (Booleans, Symbols): Supply cross-references. + +2001-05-04 Neil Jerram + + * new-docstrings.texi, posix.texi, scheme-control.texi, + scheme-data.texi, scheme-debug.texi, scheme-evaluation.texi, + scheme-io.texi, scheme-memory.texi, scheme-procedures.texi: + Automatic docstring updates (mostly argument name updates and + blank lines). + + * scheme-modules.texi: Change double hyphens to single. + + * scheme-control.texi (Lazy Catch): Completed. + + * posix.texi (Network Databases and Address Conversion): New + subsubsection `IPv6 Address Conversion'. + +2001-05-04 Thien-Thi Nguyen + + * preface.texi (iff): Use proper texi markup. + Thanks to Florian Weimer. + +2001-05-04 Martin Grabmueller + + * scheme-io.texi (Block Reading and Writing): Moved the + documentation for read-string!/partial from the node `Reading'. + + * scheme-data.texi (List/String Conversion): Added docstring for + `string-split'. + +2001-05-02 Martin Grabmueller + + * srfi-13-14.texi: Added @bullet to various @itemize lists. + + * srfi-modules.texi (SRFI Support): New file and chapter. + + * Makefile.am (guile_TEXINFOS): Added repl-modules.texi and + srfi-modules.texi. + + * guile.texi (Top): New menu entries for the new chapters. + (Top): @includes for the new chapters. + (Top): New menu entry for `SRFI Support', @include for + `srfi-modules.texi'. + + * repl-modules.texi: New file. + (Readline Support): New chapter for (ice-9 readline). + (Value History): New chapter for (ice-9 history). + +2001-05-02 Martin Grabmueller + + * scheme-modules.texi (Dynamic Libraries): Renamed from `Dynamic + Linking from Marius''. + (The Guile module system): Removed obsolete naming convention. + (Loading Guile Modules, Creating Guile Modules), + (More Module Procedures, Included Guile Modules): New nodes, split + from `The Guile module system'. + (The Guile module system): Changed references to (ice-9 slib) to + (ice-9 popen), because note everybody has SLIB installed. + (Included Guile Modules): Added a bunch of modules shipped with + Guile. + + (Dynamic Libraries): (old version) Removed. + + * scheme-io.texi (Block Reading and Writing): Corrected + capitalization, so it builds again. + +2001-05-01 Gary Houston + + * scheme-io.texi: Removed obsolete section Binary IO. Added + new section Block Reading and Writing. Updated section + Line/Delimited with module usage. + +2001-04-29 Neil Jerram + + * deprecated.texi (Tags): Removed - deprecation expired. + + * scheme-io.texi (Random Access): Removed `fseek' - deprecation + expired. + + * guile.texi (Top): Add menu entry for Manual Conventions node. + +2001-04-28 Neil Jerram + + * THANKS: Move authorship bit into AUTHORS, simplify structure, + add Dirk Herrmann. + + * AUTHORS, guile.texi, guile-tut.texi, goops.texi, Makefile.am: + Consolidate authorship information in AUTHORS file, and @include + AUTHORS from the top level source file for each manual. + +2001-04-28 Thien-Thi Nguyen + + * preface.texi (Manual Conventions): New chapter. + +2001-04-26 Martin Grabmueller + + * srfi-13-14.texi (Reverse/Append): Updated procedure names for + string-concatenate-reverse[/shared]. + (Reverse/Append): Document the parameter `end' to + string-concatenate-reverse. + +2001-04-26 Neil Jerram + + * data-rep.texi (Defining New Types (Smobs)): Use non-deprecated + smob interface. Thanks to Masao Uebayashi for the patch! + (Creating Instances): Don't need SCM_NIMP anymore. + +2001-04-25 Marius Vollmer + + * guile.1: New file, from Robert Merkel and Rob Browning. + * Makefile.am (man_MANS, EXTRADIST): Added, but still commented + out: install and distribute the manpage. It is not yet installed + or distributed since we don't have Robert's papers yet. + +2001-04-24 Neil Jerram + + * guile-tut.texi: Include version-tutorial.texi rather than + version.texi. + + * Makefile.am ($(srcdir)/version-tutorial.texi): New target, to + avoid having two files both include version.texi. + +2001-04-24 Martin Grabmueller + + * Makefile.am (guile_TEXINFOS): Added srfi-13-14.texi. + + * srfi-13-14.texi: New file documenting SRFI-13/14. + + * guile.texi (Top): Added the SRFI-13/14 menu entry and @include. + +2001-04-22 Neil Jerram + + * posix.texi (Network Sockets and Communication): Automatic + docstring updates for `socket' and `connect'. (For IPV6 support.) + + * scheme-io.texi: Remove old docstring comments referring to + r4rs.scm. + + * appendices.texi (The Basic Guile Package, Packages not shipped + with Guile), env.texi (Switching to Environments), format.texi + (Format Specification), gh.texi + (Executing Scheme code, Calling Scheme procedures from C), + guile-tut.texi (How to characterize Guile), scheme-data.texi + (Symbols, Keywords, Keyword Read Syntax, Append/Reverse), + scheme-evaluation.texi (Delayed Evaluation), scheme-modules.texi + (Scheme and modules), scheme-io.texi (Soft Ports): Change R4RS + references to R5RS. + + * r4rs.texi: Removed. + + * Makefile.am (info_TEXINFOS): Remove r4rs. + + * README: Note removal of r4rs, and provide a reference. + + * scheme-control.texi (Exceptions): Extended documentation. + (Continuations): Correct "except" typo, and fix reference to + Exceptions node. Plus minor review changes. + +2001-04-20 Neil Jerram + + * scheme-control.texi (Exceptions): Reorganized and extended + existing documentation; more to come. + +2001-04-20 Martin Grabmueller + + * scheme-evaluation.texi (Comments): Document normal comments and + comment conventions. + (Block Comments): Documented multiline comments. + (Case Sensitivity): Documented R5RS and Guile behaviour and how to + switch it off. + + * scheme-control.texi (Continuations): Added some documentation + for call/cc. + (Exceptions): Added xref to `Continuations'. + + * scheme-binding.texi (Binding Reflection): Typo fix. + +2001-04-20 Neil Jerram + + * gh.texi (Executing Scheme code): gh_eval_file returns + SCM_UNSPECIFIED. Thanks to Dirk for the report! + + * data-rep.texi (Non-immediate Datatypes, Immediates vs + Non-immediates): Emphasize current rather than pre-1.4 practice + when talking about not needing to call SCM_NIMP. + + * recipe-guidelines.txt: New file: guidelines for contributions to + the Guile Recipes manual. + +2001-04-20 Martin Grabmueller + + * intro.texi (Using Guile Modules): Wrote intro to using modules. + (Writing New Modules): New intro for writing modules. + (Reporting Bugs): Added info about what is a bug and what to + include in a bug report (taken and adapted from the Emacs + Reference Manual). + +2001-04-19 Martin Grabmueller + + * scheme-control.texi (while do): Added documentation for named + let. + + * scheme-binding.texi (Internal Definitions): New explanation of + `Internal Definitions'. + (Top Level): Documented behaviour of top level definitions. + (Binding Constructs): New introductory text. + (Local Bindings): Explain concept of local bindings. Document + let, let* and letrec. + +2001-04-18 Martin Grabmueller + + * scheme-modules.texi (Modules): Added menu descriptions. + (Scheme and modules, The Guile module system): Some whitespace + cleanup + (The Guile module system): Layout fixes, docstring fix for + `define-module'. + +2001-04-17 Martin Grabmueller + + * scheme-control.texi (Multiple Values): Documented concept of + multiple values, added docs for `receive'. + (begin): Documented `begin'. + (if cond case): Documented `if', `cond' and `case'. + (and or): Documented `and' and `or'. + (while do): Documented `do' and `while'. + + * scheme-procedures.texi (Optional Arguments): Split the node, + added introductory text, added menu for subsections. + (let-optional Reference, let-keywords Reference), + (lambda* Reference, define* Reference): Added syntax documentation + for all exported procedures from (ice-9 optargs). + +2001-04-17 Martin Grabmueller + + * scheme-utility.texi (General Conversion): New node, added + `object->string'. + (Equality): Added definition and explanation of `sameness'. + + * posix.texi (System Identification): Added `gethostname' and + `sethostname'. + (Processes): Added `setpriority' and `getpriority'. + (User Information): Added `cuserid' and `getlogin'. + (Ports and File Descriptors): Added `flock'. + (Processes): Added `chroot'. + (File System): Added `mkstemp!'. + (Encryption): New node, added `crypt' and `getpass'. + + * new-docstrings.texi: Moved several docstrings over to the + reference manual (see above which). + + * scheme-data.texi (Data Types), (Numerical Tower): Add explicit + @bullet to @itemize to satisfy older `makeinfo'. + +2001-04-16 Neil Jerram + + * data-rep.texi (Signalling Type Errors): Update SCM_ASSERT doc + for recent changes to disallow passing a string parameter as the + `pos'. Thanks to Dirk Herrmann for the patch! + +2001-04-13 Neil Jerram + + * data-rep.texi (Unpacking the SCM type): New section, taken from + Dirk Herrmann's description of SCM and scm_bits_t in api.txt. + (Immediate Datatypes, Non-immediate Datatypes): Remove obsolete + notes about needing to call SCM_NIMP. + +2001-04-11 Neil Jerram + + * scheme-procedures.texi (Procedures with Setters): Fix dvi + building syntax error. Thanks to Dale P. Smith for the report and + patch. + +2001-04-11 Martin Grabmueller + + * scheme-scheduling.texi (Arbiters): New explanatory text. + (Asyncs): New explanations and documentation. + (Scheduling): Added menu entry descriptions. + (Fluids): New documentation. + +2001-04-11 Martin Grabmueller + + * scheme-procedures.texi (Lambda): Documented the lambda form. + (Procedure Properties): Concept and usage explanation added. + (Procedures with Setters): Explain by example, introduce + definitions. + + * scheme-data.texi (Symbols and Variables): Split and reorganized + this section. + (Symbols): New introductory text. + (Characters): Added char-ci* procedures to rn index. + +2001-04-10 Neil Jerram + + * scm.texi (Handling Errors): Improve Texinfo markup. Thanks to + Dale P. Smith for the patch! + + * api.txt (Accessing Cell Entries): Fix typo. + +2001-04-09 Neil Jerram + + * deprecated.texi (Shared And Read Only Strings): New section for + deprecated string stuff. I've also updated the text a bit to + reflect current usage of "read only" strings. + + * scheme-data.texi (Shared Substrings, Read Only Strings): Moved + to deprecated.texi. + + * deprecated.texi, posix.texi, scheme-binding.texi, + scheme-control.texi, scheme-data.texi, scheme-debug.texi, + scheme-evaluation.texi, scheme-io.texi, scheme-memory.texi, + scheme-modules.texi, scheme-options.texi, scheme-procedures.texi, + scheme-scheduling.texi, scheme-translation.texi, + scheme-utility.texi: Remove `@c docstring' comments, since they + aren't used any more by the docstring tracking utilities. + +2001-04-09 Martin Grabmueller + + * scheme-data.texi (Pairs): New data type and procedure + description. + (Lists): Added new subsections for grouping the list procedures. + (Hooks): Added new nodes for hook subsections. + (String Syntax): New node, factoring out read syntax. + (Strings): Some blurb about allowed characters, zero-termination + etc. + (Keywords): Added menu descriptions. + +2001-04-08 Martin Grabmueller + + * scheme-indices.texi (R5RS Index): Print index `rn', not `r5'. + + * guile.texi: The index formerly known as `r5' is now called `rn'. + + * scheme-utility.texi, scheme-procedures.texi, scheme-io.texi, + scheme-evaluation.texi, scheme-control.texi, scheme-data.texi: + Changed all @r5index entries to @rnindex. + +2001-04-06 Martin Grabmueller + + * scheme-data.texi (Hooks): Added hook description and + constraints. + +2001-04-06 Thien-Thi Nguyen + + * scheme-scheduling.texi (Higher level thread + procedures): Replace some instances of `@var' with `@code'. + + * scheme-scheduling.texi (Higher level thread + procedures): Rewrite. + +2001-04-04 Martin Grabmueller + + * scheme-data.texi (Alphabetic Case Mapping), + (String Comparison): Rearranged function order. + (Vectors): Reorganized, new introductory text, docs about read + syntax. + +2001-04-03 Martin Grabmueller + + * scheme-options.texi, scheme-procedures.texi, + scheme-modules.texi, scheme-memory.texi, scheme-control.texi, + scheme-utility.texi, scheme-io.texi, scheme-evaluation.texi, + scheme-data.texi: Removed a lot of ARGFIXME's after tweaking + docstrings and C source. + + * new-docstrings.texi, scheme-io.texi, scheme-data.texi, + posix.texi, scheme-control.texi, scheme-evaluation.texi, + scheme-memory.texi, scheme-procedures.texi, scheme-modules.texi, + scheme-scheduling.texi: Automated docstring merging. + +2001-04-02 Neil Jerram + + * data-rep.texi (Immediates vs. Non-immediates): Update + out-of-date documentation. (Thanks to Dirk Herrmann for the + report!) + (Immediates vs Non-immediates): Renamed without the dot, since the + dot causes `info' not to be able to display this node! + + * Makefile.am (guile_TEXINFOS): Add in a few more source files + that had got left out. + +2001-03-30 Neil Jerram + + * scheme-reading.texi (Further Reading): Add bullets to further + reading list. + + * gh.texi: Insert page break before chapter. Remove page breaks + within the chapter. + + * Makefile.am: Add script-getopt.texi. + + * guile.texi (Top): Include and link to new script-getopt.texi + chapter. + + * script-getopt.texi: New chapter on command line handling. + (Written and contributed by Martin Grabmueller, revised by me.) + + * intro.texi (Modules and Extensions): Fix typo. + +2001-03-27 Martin Grabmueller + + * scheme-data.texi (Strings): Reorganized the whole `Strings' + section and wrote introductory material for each new subsection. + +2001-03-25 Marius Vollmer + + * intro.texi (Modules and Extensions): Some short text about + dynamic libraries and modules. + +2001-03-23 Neil Jerram + + * intro.texi (Writing Extensions for Guile), scheme-data.texi + (Lists): Fix typos. + + * guile-tut.texi, ChangeLog-guile-doc-tutorial: Added to CVS. It + seems that I somehow missed these out when I moved everything from + guile-doc to guile-core. + + * posix.texi, scheme-data.texi, scheme-evaluation.texi, + scheme-io.texi, scheme-memory.texi: Automatic docstring updates. + + * new-docstrings.texi: New file. Holds snarfed docstrings that + have not yet been incorporated into the reference manual. + +2001-03-20 Martin Grabmueller + + * scheme-options.texi (Evaluator options): Added evaluator + options, corrected docs for evaluator trap options. + + * scheme-evaluation.texi (Scheme Read): New docs for read-options, + read-enable, read-disable and read-set! and cross references to + option nodes. + (Evaluator Options): New docs for eval-options, eval-enable, + eval-disable and eval-set!, traps, trap-enable, trap-disable and + trap-set! and cross references to option nodes. + (Evaluator Behaviour): Renamed node from `Evaluator options' to + avoid name clash. + + * scheme-io.texi (String Ports): Added docs for SRFI-6 procedures. + (Void Ports): Corrected introductory comment. + +2001-03-16 Martin Grabmueller + + * scheme-data.texi (Arithmetic): Documented the arithmetic + procedures. + (Integer Operations): Added documentation. + (Comparison): Added documentation. + (Complex): Added documentation. + (Symbols and Variables): Comment out `builtin-bindings', which is + removed according to NEWS. + (Pairs): Added documentation. + + * scheme-io.texi: Added R5RS index entries for all R5RS + procedures. + (File Ports): New docs for `call-with-input-file', + `call-with-output-file', `with-input-from-file', + `with-output-to-file', `with-error-to-file'. + + * scheme-control.texi, scheme-utility.texi, + * scheme-procedures.texi: Added R5RS index entries for all R5RS + procedures. + + * scheme-evaluation.texi (Fly Evaluation): Added documentation for + `apply'. Added R5RS index entries for all R5RS procedures. + + * scheme-data.texi: Added R5RS index entries for all R5RS + procedures. Removed R5RS index entries for `ass{q,v,occ}-set!'. + Removed explicit entries into the function entries. They are + automagic. + (Vectors): Added documentation for `make-vector', `vector-ref' and + `vector-set!'. + +2001-03-12 Marius Vollmer + + * intro.texi: Changed to reflect current practice better. Added + stuff about writing Guile Extensions (aka dynamically loaded + shared libraries). + +2001-03-09 Mikael Djurfeldt + + * goops.texi (VERSION): Bumped to version 0.3. + + * goops-tutorial.texi, goops.texi: Updated to reflect new + define-method syntax. + +2001-03-09 Neil Jerram + + * Makefile.am: Change HTML to HTMLDOC, now that we're part of a + wider distribution. + + Moving documentation files from guile-doc and guile-doc into + guile-core/doc: + + * env.texi, indices.texi, mbapi.texi, mltext.texi, scripts.texi, + scsh.texi, tcltk.texi, hierarchy.txt, scheme-indices.texi, + slib.texi, deprecated.texi, scheme-binding.texi, appendices.texi, + scheme-intro.texi, goops.texi, extend.texi, gh.texi, intro.texi, + preface.texi, scm.texi, goops-tutorial.texi, hierarchy.eps, + r4rs.texi, r5rs.texi, texinfo.tex, scheme-reading.texi, + data-rep.texi, scheme-utility.texi, posix.texi, + scheme-control.texi, scheme-debug.texi, scheme-evaluation.texi, + scheme-io.texi, scheme-memory.texi, scheme-modules.texi, + scheme-options.texi, scheme-procedures.texi, + scheme-scheduling.texi, scheme-translation.texi, guile.texi, + scheme-data.texi, scheme-ideas.texi, expect.texi, + ChangeLog-guile-doc-ref, guile-tut.texi, + ChangeLog-guile-doc-tutorial, AUTHORS, BUGS, NEWS, THANKS: New + files. + + * .cvsignore, Makefile.am, README: Merged. + + * sources: New subdirectory. + + Both the following files are about to be replaced by files from + guile-doc/ref. + + * texinfo.tex: Removed. + + * data-rep.texi: Removed. + +2001-02-15 Neil Jerram + + * README: Explain retirement of `data-rep.texi'. + + * Makefile.am (info_TEXINFOS, data_rep_TEXINFOS): Removed. + + * data-rep.texi: Replace this copy of data-rep.texi with a notice + indicating that it has been retired. The master copy of + data-rep.texi is at guile-doc/ref/data-rep.texi. + +2001-02-04 Marius Vollmer + + * data-rep.texi: Use SCM_SMOB_DATA instead of SCM_CDR. Also + things like SCM_SMOB_PREDICATE and SCM_NEWSMOB. Thanks to Dale + P. Smith! + +2000-10-25 Mikael Djurfeldt + + * mop.text: Preliminary documentation of the GOOPS meta object + protocol. + +2000-07-28 Neil Jerram + + * data-rep.texi (Garbage Collection): Fix "accomodate" spelling + mistake. + +2000-06-30 Dirk Herrmann + + * data-rep.tex: Removed documentation for SCM_OUTOFRANGE. + +2000-06-20 Mikael Djurfeldt + + * data-rep.texi: Center discussion around the standard interface + for smob type creation (scm_make_smob_type) and warn about the + ongoing discussion which may result in deprecating + scm_make_smob_type_mfpe in next release of Guile. + +2000-05-15 Dirk Herrmann + + * data-rep.texi: Updated the macro names for operating on + characters. + +2000-03-22 Dirk Herrmann + + * api.txt: Added a first attempt for a description of the newly + designed low level API. + +2000-01-31 Marius Vollmer + + * Makefile.am (version.texi): Override automake's rule for + version.texi so that it gets created even in non-maintainer-mode. + +Thu Jan 20 13:00:18 2000 Greg J. Badros + + * version.texi, stamp-vti: Removed -- these are auto-generated. + +2000-01-12 Mikael Djurfeldt + + * Makefile.am (dist-hook): Updated to include oldfmt.c in + distribution archive. + + * README: Updated with note about oldfmt.c. + + * oldfmt.c: New file: Used by application writers to adapt to + new-style error format strings. + +1999-12-06 Gary Houston + + * data-rep.texi: change dircategory to match change in guile-doc + and scm. + +1999-10-05 Jim Blandy + + * Makefile.in: Deleted from CVS repository. Run the autogen.sh + script to create generated files like this one. + +1999-09-11 Jim Blandy + + * Makefile.in: Regenerated. + +Fri Jun 25 22:21:43 1999 Greg Badros + + * data-rep.texi: Updated SMOB docs to talk about + scm_make_smob_type_mfpe, SCM_RETURN_NEWSMOB, SCM_NEWSMOB function + and macros. + +1999-04-17 Jim Blandy + + * Makefile.in: Regenerated. + +1998-10-19 Jim Blandy + + * COPYING: New file. + * Makefile.in: Regenerated. + + * Makefile.am (EXAMPLE_SMOB_FILES): List example-smob/COPYING. + * Makefile.in: Regenerated. + +1998-10-16 Jim Blandy + + * Makefile.in: Regenerated, after change to qthreads.m4. + +1998-10-15 Jim Blandy + + * stamp-vti: Regenerated. + + * hacks.el: Some handy helper functions for working on the manual. + + * data-rep.texi: Extended to accomodate a full running example, + provided with the manual. + * example-smob: A new subdirectory, containing example files for + the manual chapter on smobs. + * Makefile.am (EXAMPLE_SMOB_FILES, dist-hook): New variable and + target, to get the example-smob directory into the distribution. + * Makefile.in: Regenerated. + +1998-10-08 Jim Blandy + + * .cvsignore: New file, containing data-rep.info. I'm not sure + whether we want to check this file into CVS, because it's + generated; if you find compelling reasons it should be, let me + know. + +1998-10-07 Jim Blandy + + * New directory for documentation. + * README: New file. + * data-rep.texi: It's not a real manual, but it's better than + nothing. + * Makefile.am, Makefile.in, data-rep.info, data-rep.texi, + mdate-sh, stamp-vti, texinfo.tex, version.texi: The usual support + files. diff --git a/guile18/doc/ChangeLog-guile-doc b/guile18/doc/ChangeLog-guile-doc new file mode 100644 index 0000000000..74ce49b550 --- /dev/null +++ b/guile18/doc/ChangeLog-guile-doc @@ -0,0 +1,48 @@ +2001-02-15 Neil Jerram + + * sources/data-rep.texi: Removed. (ref/data-rep.texi is now the + current version of this essay.) + +2001-01-26 Neil Jerram + + * configure.in: Only check for `texi2html' program if HTML is + enabled, and explain where to get `texi2html' from if the check + fails. + + * configure.in, Makefile.am, ref/Makefile.am, + tutorial/Makefile.am: Clean up Makefile.am's and support + (configurable) building of HTML documentation in addition to + Info. Thanks to Steve Tell for the patch on which these changes + were based. + +2000-10-14 Neil Jerram + + * sources/data-rep.texi: Merged a lot of changes from + guile-core/doc/data-rep.texi. + +2000-08-07 Neil Jerram + + * configure.in, configure: Advance version number to 1.4. + +2000-07-28 Neil Jerram + + * sources/data-rep.texi (Garbage Collection): Fix "accomodate" + spelling mistake. + +1998-07-27 Mark Galassi + + * simple test + +1998-04-13 Marius Vollmer + + Have "make dist" include the sources directory: + * Makefile.am: Added "sources" directory to SUBDIRS. + * sources/Makefile.am: New file. + * configure.in: Added "sources/Makefile" to AC_OUTPUT. + +Sun Jun 22 18:38:28 1997 Tim Pierce + + New documentation module. + + + diff --git a/guile18/doc/Makefile.am b/guile18/doc/Makefile.am new file mode 100644 index 0000000000..4581a72913 --- /dev/null +++ b/guile18/doc/Makefile.am @@ -0,0 +1,46 @@ +## Process this file with Automake to create Makefile.in +## +## Copyright (C) 1998, 2002, 2006, 2008 Free Software Foundation, Inc. +## +## This file is part of GUILE. +## +## GUILE is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as +## published by the Free Software Foundation; either version 2, or +## (at your option) any later version. +## +## GUILE is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public +## License along with GUILE; see the file COPYING. If not, write +## to the Free Software Foundation, Inc., 51 Franklin Street, Fifth +## Floor, Boston, MA 02110-1301 USA + +AUTOMAKE_OPTIONS = gnu + +SUBDIRS = ref tutorial goops r5rs + +dist_man1_MANS = guile.1 + +EXAMPLE_SMOB_FILES = \ + ChangeLog-2008 Makefile README image-type.c image-type.h myguile.c + +OLDFMT = oldfmt.c + +dist-hook: + cp $(srcdir)/$(OLDFMT) $(distdir)/ + mkdir $(distdir)/example-smob + for f in $(EXAMPLE_SMOB_FILES); do \ + cp $(srcdir)/example-smob/$$f $(distdir)/example-smob/; \ + done + +EXTRA_DIST = groupings.alist ChangeLog-2008 # guile-api.alist + +include $(top_srcdir)/am/maintainer-dirs +guile-api.alist: guile-api.alist-FORCE + ( cd $(top_builddir) ; $(mscripts)/update-guile-api.alist ) +guile-api.alist-FORCE: + diff --git a/guile18/doc/NEWS b/guile18/doc/NEWS new file mode 100644 index 0000000000..67c558e7c7 --- /dev/null +++ b/guile18/doc/NEWS @@ -0,0 +1,44 @@ +Guile-doc NEWS --- history of user-visible changes. -*- text -*- +Copyright (C) 1997, 2001, 2006 Free Software Foundation, Inc. +See the end for copying conditions. + + +Changes since Guile 1.3.4: + +* It's now possible to build HTML documentation as well as Info + +The guile-doc distribution now supports building HTML versions of the +Guile tutorial and reference manual, in addition to the standard Info +documentation. To enable this, include the `--enable-html' option +when you run `./configure': + + ./configure --enable-html + +HTML documentation is installed in $(prefix)/html/guile-$(VERSION). + + +Changes since Guile 1.0 (Sun 5 Jan 1997): + +* The current documentation approach, recommended by Jim Blandy, is to +have: (*) a tutorial with the pedagogical style of guile-user, and a +non-dry reference manual in the style of the most excellent GNU libc +reference manual: the reference manual should be complete, but at the +same time it should have an introductory screen for each major topic, +which can be referenced if the user goes "up" a level in the info +documentation. + + +Copyright information: + +Copyright (C) 1996,1997, 2006 Free Software Foundation, Inc. + + Permission is granted to anyone to make or distribute verbatim copies + of this document as received, in any medium, provided that the + copyright notice and this permission notice are preserved, + thus giving the recipient permission to redistribute in turn. + + Permission is granted to distribute modified versions + of this document, or of portions of it, + under the above conditions, provided also that they + carry prominent notices stating who last changed them. + diff --git a/guile18/doc/README b/guile18/doc/README new file mode 100644 index 0000000000..3ecd329b43 --- /dev/null +++ b/guile18/doc/README @@ -0,0 +1,33 @@ +This directory contains documentation on the Guile core. -*-text-*- + +The documentation consists of the following manuals. + +- The Guile Tutorial (guile-tut.texi) contains a tutorial introduction + to using Guile. + +- The Guile Reference Manual (guile.texi) contains (or is intended to + contain) reference documentation on all aspects of Guile. + +- The GOOPS Manual (goops.texi) contains both tutorial-style and + reference documentation for using GOOPS, Guile's Object Oriented + Programming System. + +- The Revised^5 Report on the Algorithmic Language Scheme (r5rs.texi). + +Please be aware that this is all very much work in progress (apart +from the Revised^5 Report). Bug reports and contributions are +welcome! + +The file `oldfmt.c' contains a function which can be used by +application writers to support both old-style and new-style error +format strings. + +The `sources' directory includes some stuff relevant to the Guile +reference manual, and which may eventually be folded in to it. It's +not immediately relevant, however, which is why it's not in this +directory. + +The Revised^4 Report (r4rs.texi) is no longer in this distribution, as +it is completely superseded by the Revised^5 Report. If you need to +consult R4RS, it is still widely available, for example at +http://www-swiss.ai.mit.edu/projects/info/SchemeDocs/r4rs/. diff --git a/guile18/doc/THANKS b/guile18/doc/THANKS new file mode 100644 index 0000000000..53cff29f48 --- /dev/null +++ b/guile18/doc/THANKS @@ -0,0 +1,19 @@ +Many thanks to the following people for contributing to the Guile +manuals! + +Proofreading, bug reports and patches from: + Chris Bitmead +Christopher Cramer + Marcus Daniels + Dirk Herrmann + Dale P. Smith + Steve Tell + Lee Thomas + Masao Uebayashi + Joel Weber + Keith Wright + +New entries from: + Per Bothner + Martin Grabmueller + Thien Thi Nguyen diff --git a/guile18/doc/example-smob/ChangeLog-2008 b/guile18/doc/example-smob/ChangeLog-2008 new file mode 100644 index 0000000000..9318608492 --- /dev/null +++ b/guile18/doc/example-smob/ChangeLog-2008 @@ -0,0 +1,56 @@ +2008-01-22 Neil Jerram + + * COPYING: Removed. + +2004-09-24 Marius Vollmer + + * image-type.c: Updated from manual. + +2002-02-28 Marius Vollmer + + * image-type.c (image_tag): Changed type to scm_t_bits. + (make_image): Use scm_gc_malloc instead of scm_must_malloc. + (free_image): Use scm_gc_free instead of free. Return zero. + +2001-05-30 Martin Grabmueller + + * image-type.c: Adapted to new typing and naming convention. + +2001-04-26 Neil Jerram + + * image-type.c (make_image): Don't need to use SCM_NIMP before + SCM_STRINGP. + (clear_image): Use SCM_SMOB_PREDICATE. + (clear_image, mark_image, free_image, print_image): Use + SCM_SMOB_DATA rather than SCM_CDR. + +2000-06-20 Mikael Djurfeldt + + * image-type.c: Removed unused scm_smobfuns structure. + (init_image_type): Use standard smob type interface. + +Fri Jun 25 22:21:04 1999 Greg Badros + + * image-type.c: Updated example to use scm_make_smob_type_mfpe, + SCM_RETURN_NEWSMOB, SCM_NEWSMOB function and macros. + +1998-10-19 Jim Blandy + + * image-type.c, myguile.c: Terminate copyright comments. + + * COPYING: New file. + * image-type.c myguile.c: Add copyright notice. + +1998-10-16 Jim Blandy + + * Makefile (myguile): Fix link command, to put the Guile libraries + after the object files. The old command worked on my machine, but + I don't see how. + +1998-10-15 Jim Blandy + + Created this directory for the Guile 1.3 release. Thanks to Jay + Glascoe for suggesting that we provide a complete, buildable + example! + * ChangeLog, Makefile, README, image-type.c, image-type.h, + myguile: New files. diff --git a/guile18/doc/example-smob/README b/guile18/doc/example-smob/README new file mode 100644 index 0000000000..1380db1235 --- /dev/null +++ b/guile18/doc/example-smob/README @@ -0,0 +1,6 @@ +This is the example code for the ``Defining New Types (Smobs)'' +chapter of the Guile manual. + +When you try to execute the code, if the system complains that it +can't find libguile.so, you need to add the directory containing the +installed Guile libraries to your LD_LIBRARY_PATH environment variable. diff --git a/guile18/doc/example-smob/image-type.c b/guile18/doc/example-smob/image-type.c new file mode 100644 index 0000000000..68ecded9d6 --- /dev/null +++ b/guile18/doc/example-smob/image-type.c @@ -0,0 +1,137 @@ +/* image-type.c + * + * Copyright (C) 1998, 2000, 2004, 2006 Free Software Foundation, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#include +#include + +static scm_t_bits image_tag; + +struct image { + int width, height; + char *pixels; + + /* The name of this image */ + SCM name; + + /* A function to call when this image is + modified, e.g., to update the screen, + or SCM_BOOL_F if no action necessary */ + SCM update_func; +}; + +static SCM +make_image (SCM name, SCM s_width, SCM s_height) +{ + SCM smob; + struct image *image; + int width = scm_to_int (s_width); + int height = scm_to_int (s_height); + + /* Step 1: Allocate the memory block. + */ + image = (struct image *) scm_gc_malloc (sizeof (struct image), "image"); + + /* Step 2: Initialize it with straight code. + */ + image->width = width; + image->height = height; + image->pixels = NULL; + image->name = SCM_BOOL_F; + image->update_func = SCM_BOOL_F; + + /* Step 3: Create the smob. + */ + SCM_NEWSMOB (smob, image_tag, image); + + /* Step 4: Finish the initialization. + */ + image->name = name; + image->pixels = scm_gc_malloc (width * height, "image pixels"); + + return smob; +} + +SCM +clear_image (SCM image_smob) +{ + int area; + struct image *image; + + scm_assert_smob_type (image_tag, image_smob); + + image = (struct image *) SCM_SMOB_DATA (image_smob); + area = image->width * image->height; + memset (image->pixels, 0, area); + + /* Invoke the image's update function. + */ + if (scm_is_true (image->update_func)) + scm_call_0 (image->update_func); + + scm_remember_upto_here_1 (image_smob); + + return SCM_UNSPECIFIED; +} + +static SCM +mark_image (SCM image_smob) +{ + /* Mark the image's name and update function. */ + struct image *image = (struct image *) SCM_SMOB_DATA (image_smob); + + scm_gc_mark (image->name); + return image->update_func; +} + +static size_t +free_image (SCM image_smob) +{ + struct image *image = (struct image *) SCM_SMOB_DATA (image_smob); + + scm_gc_free (image->pixels, image->width * image->height, "image pixels"); + scm_gc_free (image, sizeof (struct image), "image"); + + return 0; +} + +static int +print_image (SCM image_smob, SCM port, scm_print_state *pstate) +{ + struct image *image = (struct image *) SCM_SMOB_DATA (image_smob); + + scm_puts ("#name, port); + scm_puts (">", port); + + /* non-zero means success */ + return 1; +} + +void +init_image_type (void) +{ + image_tag = scm_make_smob_type ("image", sizeof (struct image)); + scm_set_smob_mark (image_tag, mark_image); + scm_set_smob_free (image_tag, free_image); + scm_set_smob_print (image_tag, print_image); + + scm_c_define_gsubr ("clear-image", 1, 0, 0, clear_image); + scm_c_define_gsubr ("make-image", 3, 0, 0, make_image); +} diff --git a/guile18/doc/example-smob/image-type.h b/guile18/doc/example-smob/image-type.h new file mode 100644 index 0000000000..38fcf74c45 --- /dev/null +++ b/guile18/doc/example-smob/image-type.h @@ -0,0 +1,3 @@ +/* file "image-type.h" */ + +void init_image_type (void); diff --git a/guile18/doc/example-smob/myguile.c b/guile18/doc/example-smob/myguile.c new file mode 100644 index 0000000000..9df3cf31b7 --- /dev/null +++ b/guile18/doc/example-smob/myguile.c @@ -0,0 +1,37 @@ +/* myguile.c + * + * Copyright (C) 1998, 2006 Free Software Foundation, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#include +#include "image-type.h" + +static void +inner_main (void *closure, int argc, char **argv) +{ + /* module initializations would go here */ + init_image_type(); + scm_shell (argc, argv); +} + +int +main (int argc, char **argv) +{ + scm_boot_guile (argc, argv, inner_main, 0); + return 0; /* never reached */ +} diff --git a/guile18/doc/goops/ChangeLog-2008 b/guile18/doc/goops/ChangeLog-2008 new file mode 100644 index 0000000000..a5a637d7bd --- /dev/null +++ b/guile18/doc/goops/ChangeLog-2008 @@ -0,0 +1,76 @@ +2008-02-06 Neil Jerram + + * goops-tutorial.texi (Next-method): Minor improvements to the + text. + +2006-09-28 Neil Jerram + + * goops.texi (Slot Options): Added example from Ludovic Courtès + about difference between init-value, -form and -thunk. + +2006-04-21 Kevin Ryde + + * hierarchy.pdf: New file, converted from hierarchy.eps using + epstopdf, to let "make pdf" work. + * Makefile.am: (goops_TEXINFOS): Add it. + +2006-03-08 Ludovic Courtès + + * goops.texi (Slot Options): Note init-value is shared. + +2006-02-06 Marius Vollmer + + * goops.texi (Basic Generic Function Creation): Added blurb about + merge-generics duplicates handler from NEWS. + +2004-06-28 Marius Vollmer + + * Makefile.am: Removed home-grown code for HTML generation. + Automake does it for us now. + (goops_TEXINFOS): Added hierarchy.png + + * hierarchy.png: New file. + +2004-05-19 Kevin Ryde + + * Makefile.am (CLEANFILES): Remove, goops.tmp goops.cps cleaned by + automake these days. + +2003-04-17 Mikael Djurfeldt + + * goops.texi (Object Comparisons): Removed object-eqv? and + object-equal? and added eqv?, equal? and =. + +2003-01-10 Mikael Djurfeldt + + * goops.texi (Class Redefinition): Clarifications; Removed + mentioning of change-object-class. + +2002-11-07 Neil Jerram + + * goops.texi (Top): Say "Indices" before index nodes in main menu. + (Index): Removed (it was empty). Generally remove unnecessary + padding text that looks bad in HTML. + +2002-04-17 Marius Vollmer + + * Makefile.am (CLEANFILES): Added goops.tmp, goops.cps. + +2001-12-03 Thien-Thi Nguyen + + * goops.texi: Grammar fix. + +2001-08-27 Neil Jerram + + * Makefile.am (goops_TEXINFOS): Remove ../AUTHORS. + (TEXINFO_TEX): Added; avoids shipping multiple copies of + texinfo.tex in a single distribution. + + * goops.texi: Incorporate text previously in separate AUTHORS + file. + +2001-08-27 Neil Jerram + + The change log for files in this directory continues backwards + from 2001-08-27 in ../ChangeLog, as all the Guile documentation + prior to this date was contained in a single directory. diff --git a/guile18/doc/goops/Makefile.am b/guile18/doc/goops/Makefile.am new file mode 100644 index 0000000000..03794c4de8 --- /dev/null +++ b/guile18/doc/goops/Makefile.am @@ -0,0 +1,29 @@ +## Process this file with Automake to create Makefile.in +## +## Copyright (C) 1998, 2004, 2006, 2008 Free Software Foundation, Inc. +## +## This file is part of GUILE. +## +## GUILE is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as +## published by the Free Software Foundation; either version 2, or +## (at your option) any later version. +## +## GUILE is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public +## License along with GUILE; see the file COPYING. If not, write +## to the Free Software Foundation, Inc., 51 Franklin Street, Fifth +## Floor, Boston, MA 02110-1301 USA + +AUTOMAKE_OPTIONS = gnu + +info_TEXINFOS = goops.texi + +goops_TEXINFOS = goops-tutorial.texi \ + hierarchy.eps hierarchy.png hierarchy.txt hierarchy.pdf + +EXTRA_DIST = ChangeLog-2008 diff --git a/guile18/doc/goops/goops-tutorial.texi b/guile18/doc/goops/goops-tutorial.texi new file mode 100644 index 0000000000..11155dfae1 --- /dev/null +++ b/guile18/doc/goops/goops-tutorial.texi @@ -0,0 +1,837 @@ +@c Original attribution: + +@c +@c STk Reference manual (Appendix: An Introduction to STklos) +@c +@c Copyright © 1993-1999 Erick Gallesio - I3S-CNRS/ESSI +@c Permission to use, copy, modify, distribute,and license this +@c software and its documentation for any purpose is hereby granted, +@c provided that existing copyright notices are retained in all +@c copies and that this notice is included verbatim in any +@c distributions. No written agreement, license, or royalty fee is +@c required for any of the authorized uses. +@c This software is provided ``AS IS'' without express or implied +@c warranty. +@c + +@c Adapted for use in Guile with the authors permission + +@c @macro goops @c was {\stklos} +@c GOOPS +@c @end macro + +@c @macro guile @c was {\stk} +@c Guile +@c @end macro + +This is chapter was originally written by Erick Gallesio as an appendix +for the STk reference manual, and subsequently adapted to @goops{}. + +@menu +* Copyright:: +* Intro:: +* Class definition and instantiation:: +* Inheritance:: +* Generic functions:: +@end menu + +@node Copyright, Intro, Tutorial, Tutorial +@section Copyright + +Original attribution: + +STk Reference manual (Appendix: An Introduction to STklos) + +Copyright © 1993-1999 Erick Gallesio - I3S-CNRS/ESSI +Permission to use, copy, modify, distribute,and license this +software and its documentation for any purpose is hereby granted, +provided that existing copyright notices are retained in all +copies and that this notice is included verbatim in any +distributions. No written agreement, license, or royalty fee is +required for any of the authorized uses. +This software is provided ``AS IS'' without express or implied +warranty. + +Adapted for use in Guile with the authors permission + +@node Intro, Class definition and instantiation, Copyright, Tutorial +@section Introduction + +@goops{} is the object oriented extension to @guile{}. Its +implementation is derived from @w{STk-3.99.3} by Erick Gallesio and +version 1.3 of the Gregor Kiczales @cite{Tiny-Clos}. It is very close +to CLOS, the Common Lisp Object System (@cite{CLtL2}) but is adapted for +the Scheme language. + +Briefly stated, the @goops{} extension gives the user a full object +oriented system with multiple inheritance and generic functions with +multi-method dispatch. Furthermore, the implementation relies on a true +meta object protocol, in the spirit of the one defined for CLOS +(@cite{Gregor Kiczales: A Metaobject Protocol}). + +The purpose of this tutorial is to introduce briefly the @goops{} +package and in no case will it replace the @goops{} reference manual +(which needs to be urgently written now@ @dots{}). + +Note that the operations described in this tutorial resides in modules +that may need to be imported before being available. The main module is +imported by evaluating: + +@lisp +(use-modules (oop goops)) +@end lisp +@findex (oop goops) +@cindex main module +@cindex loading +@cindex preparing + +@node Class definition and instantiation, Inheritance, Intro, Tutorial +@section Class definition and instantiation + +@menu +* Class definition:: +@end menu + +@node Class definition, , Class definition and instantiation, Class definition and instantiation +@subsection Class definition + +A new class is defined with the @code{define-class}@footnote{Don't +forget to import the @code{(oop goops)} module} macro. The syntax of +@code{define-class} is close to CLOS @code{defclass}: + +@findex define-class +@cindex class +@lisp +(define-class @var{class} (@var{superclass} @dots{}) + @var{slot-description} @dots{} + @var{class-option} @dots{}) +@end lisp + +Class options will not be discussed in this tutorial. The list of +@var{superclass}es specifies which classes to inherit properties from +@var{class} (see @ref{Inheritance} for more details). A +@var{slot-description} gives the name of a slot and, eventually, some +``properties'' of this slot (such as its initial value, the function +which permit to access its value, @dots{}). Slot descriptions will be +discussed in @ref{Slot description}. +@cindex slot + +As an example, let us define a type for representation of complex +numbers in terms of real numbers. This can be done with the following +class definition: + +@lisp +(define-class () + r i) +@end lisp + +This binds the variable @code{}@footnote{@code{} is in +fact a builtin class in GOOPS. Because of this, GOOPS will create a new +class. The old class will still serve as the type for Guile's native +complex numbers.} to a new class whose instances contain two +slots. These slots are called @code{r} an @code{i} and we suppose here +that they contain respectively the real part and the imaginary part of a +complex number. Note that this class inherits from @code{} which +is a pre-defined class. (@code{} is the direct super class of +the pre-defined class @code{} which, in turn, is the super +class of @code{} which is the super of +@code{}.)@footnote{With the new definition of @code{}, +a @code{} is not a @code{} since @code{} inherits +from @code{ } rather than @code{}. In practice, +inheritance could be modified @emph{a posteriori}, if needed. However, +this necessitates some knowledge of the meta object protocol and it will +not be shown in this document}. + +@node Inheritance, Generic functions, Class definition and instantiation, Tutorial +@section Inheritance +@c \label{inheritance} + +@menu +* Class hierarchy and inheritance of slots:: +* Instance creation and slot access:: +* Slot description:: +* Class precedence list:: +@end menu + +@node Class hierarchy and inheritance of slots, Instance creation and slot access, Inheritance, Inheritance +@subsection Class hierarchy and inheritance of slots +Inheritance is specified upon class definition. As said in the +introduction, @goops{} supports multiple inheritance. Here are some +class definitions: + +@lisp +(define-class A () a) +(define-class B () b) +(define-class C () c) +(define-class D (A B) d a) +(define-class E (A C) e c) +(define-class F (D E) f) +@end lisp + +@code{A}, @code{B}, @code{C} have a null list of super classes. In this +case, the system will replace it by the list which only contains +@code{}, the root of all the classes defined by +@code{define-class}. @code{D}, @code{E}, @code{F} use multiple +inheritance: each class inherits from two previously defined classes. +Those class definitions define a hierarchy which is shown in Figure@ 1. +In this figure, the class @code{} is also shown; this class is the +super class of all Scheme objects. In particular, @code{} is the +super class of all standard Scheme types. + +@example +@group +@image{hierarchy} +@center @emph{Fig 1: A class hierarchy} +@iftex +@emph{(@code{} which is the direct subclass of @code{} +and the direct superclass of @code{} has been omitted in this +figure.)} +@end iftex +@end group +@end example + +The set of slots of a given class is calculated by taking the union of the +slots of all its super class. For instance, each instance of the class +D, defined before will have three slots (@code{a}, @code{b} and +@code{d}). The slots of a class can be obtained by the @code{class-slots} +primitive. For instance, + +@lisp +(class-slots A) @result{} ((a)) +(class-slots E) @result{} ((a) (e) (c)) +(class-slots F) @result{} ((e) (c) (b) (d) (a) (f)) +@c used to be ((d) (a) (b) (c) (f)) +@end lisp + +@emph{Note: } The order of slots is not significant. + +@node Instance creation and slot access, Slot description, Class hierarchy and inheritance of slots, Inheritance +@subsection Instance creation and slot access + +Creation of an instance of a previously defined +class can be done with the @code{make} procedure. This +procedure takes one mandatory parameter which is the class of the +instance which must be created and a list of optional +arguments. Optional arguments are generally used to initialize some +slots of the newly created instance. For instance, the following form + +@findex make +@cindex instance +@lisp +(define c (make )) +@end lisp + +will create a new @code{} object and will bind it to the @code{c} +Scheme variable. + +Accessing the slots of the new complex number can be done with the +@code{slot-ref} and the @code{slot-set!} primitives. @code{Slot-set!} +primitive permits to set the value of an object slot and @code{slot-ref} +permits to get its value. + +@findex slot-set! +@findex slot-ref +@lisp +@group +(slot-set! c 'r 10) +(slot-set! c 'i 3) +(slot-ref c 'r) @result{} 10 +(slot-ref c 'i) @result{} 3 +@end group +@end lisp + +Using the @code{describe} function is a simple way to see all the +slots of an object at one time: this function prints all the slots of an +object on the standard output. + +First load the module @code{(oop goops describe)}: + +@example +@code{(use-modules (oop goops describe))} +@end example + +The expression + +@smalllisp +(describe c) +@end smalllisp + +will now print the following information on the standard output: + +@lisp +#< 401d8638> is an instance of class +Slots are: + r = 10 + i = 3 +@end lisp + +@node Slot description, Class precedence list, Instance creation and slot access, Inheritance +@subsection Slot description +@c \label{slot-description} + +When specifying a slot, a set of options can be given to the +system. Each option is specified with a keyword. The list of authorized +keywords is given below: + +@cindex keyword +@itemize @bullet +@item +@code{#:init-value} permits to supply a default value for the slot. This +default value is obtained by evaluating the form given after the +@code{#:init-form} in the global environment, at class definition time. +@cindex default slot value +@findex #:init-value +@cindex top level environment + +@item +@code{#:init-thunk} permits to supply a thunk that will provide a +default value for the slot. The value is obtained by evaluating the +thunk a instance creation time. +@c CHECKME: in the global environment? +@findex default slot value +@findex #:init-thunk +@cindex top level environment + +@item +@code{#:init-keyword} permits to specify the keyword for initializing a +slot. The init-keyword may be provided during instance creation (i.e. in +the @code{make} optional parameter list). Specifying such a keyword +during instance initialization will supersede the default slot +initialization possibly given with @code{#:init-form}. +@findex #:init-keyword + +@item +@code{#:getter} permits to supply the name for the +slot getter. The name binding is done in the +environment of the @code{define-class} macro. +@findex #:getter +@cindex top level environment +@cindex getter + +@item +@code{#:setter} permits to supply the name for the +slot setter. The name binding is done in the +environment of the @code{define-class} macro. +@findex #:setter +@cindex top level environment +@cindex setter + +@item +@code{#:accessor} permits to supply the name for the +slot accessor. The name binding is done in the global +environment. An accessor permits to get and +set the value of a slot. Setting the value of a slot is done with the extended +version of @code{set!}. +@findex set! +@findex #:accessor +@cindex top level environment +@cindex accessor + +@item +@code{#:allocation} permits to specify how storage for +the slot is allocated. Three kinds of allocation are provided. +They are described below: + +@itemize @minus +@item +@code{#:instance} indicates that each instance gets its own storage for +the slot. This is the default. +@item +@code{#:class} indicates that there is one storage location used by all +the direct and indirect instances of the class. This permits to define a +kind of global variable which can be accessed only by (in)direct +instances of the class which defines this slot. +@item +@code{#:each-subclass} indicates that there is one storage location used +by all the direct instances of the class. In other words, if two classes +are not siblings in the class hierarchy, they will not see the same +value. +@item +@code{#:virtual} indicates that no storage will be allocated for this +slot. It is up to the user to define a getter and a setter function for +this slot. Those functions must be defined with the @code{#:slot-ref} +and @code{#:slot-set!} options. See the example below. +@findex #:slot-set! +@findex #:slot-ref +@findex #:virtual +@findex #:class +@findex #:each-subclass +@findex #:instance +@findex #:allocation +@end itemize +@end itemize + +To illustrate slot description, we shall redefine the @code{} class +seen before. A definition could be: + +@lisp +(define-class () + (r #:init-value 0 #:getter get-r #:setter set-r! #:init-keyword #:r) + (i #:init-value 0 #:getter get-i #:setter set-i! #:init-keyword #:i)) +@end lisp + +With this definition, the @code{r} and @code{i} slot are set to 0 by +default. Value of a slot can also be specified by calling @code{make} +with the @code{#:r} and @code{#:i} keywords. Furthermore, the generic +functions @code{get-r} and @code{set-r!} (resp. @code{get-i} and +@code{set-i!}) are automatically defined by the system to read and write +the @code{r} (resp. @code{i}) slot. + +@lisp +(define c1 (make #:r 1 #:i 2)) +(get-r c1) @result{} 1 +(set-r! c1 12) +(get-r c1) @result{} 12 +(define c2 (make #:r 2)) +(get-r c2) @result{} 2 +(get-i c2) @result{} 0 +@end lisp + +Accessors provide an uniform access for reading and writing an object +slot. Writing a slot is done with an extended form of @code{set!} +which is close to the Common Lisp @code{setf} macro. So, another +definition of the previous @code{} class, using the +@code{#:accessor} option, could be: + +@findex set! +@lisp +(define-class () + (r #:init-value 0 #:accessor real-part #:init-keyword #:r) + (i #:init-value 0 #:accessor imag-part #:init-keyword #:i)) +@end lisp + +Using this class definition, reading the real part of the @code{c} +complex can be done with: +@lisp +(real-part c) +@end lisp +and setting it to the value contained in the @code{new-value} variable +can be done using the extended form of @code{set!}. +@lisp +(set! (real-part c) new-value) +@end lisp + +Suppose now that we have to manipulate complex numbers with rectangular +coordinates as well as with polar coordinates. One solution could be to +have a definition of complex numbers which uses one particular +representation and some conversion functions to pass from one +representation to the other. A better solution uses virtual slots. A +complete definition of the @code{} class using virtual slots is +given in Figure@ 2. + +@example +@group +@lisp +(define-class () + ;; True slots use rectangular coordinates + (r #:init-value 0 #:accessor real-part #:init-keyword #:r) + (i #:init-value 0 #:accessor imag-part #:init-keyword #:i) + ;; Virtual slots access do the conversion + (m #:accessor magnitude #:init-keyword #:magn + #:allocation #:virtual + #:slot-ref (lambda (o) + (let ((r (slot-ref o 'r)) (i (slot-ref o 'i))) + (sqrt (+ (* r r) (* i i))))) + #:slot-set! (lambda (o m) + (let ((a (slot-ref o 'a))) + (slot-set! o 'r (* m (cos a))) + (slot-set! o 'i (* m (sin a)))))) + (a #:accessor angle #:init-keyword #:angle + #:allocation #:virtual + #:slot-ref (lambda (o) + (atan (slot-ref o 'i) (slot-ref o 'r))) + #:slot-set! (lambda(o a) + (let ((m (slot-ref o 'm))) + (slot-set! o 'r (* m (cos a))) + (slot-set! o 'i (* m (sin a))))))) + +@end lisp +@center @emph{Fig 2: A @code{} number class definition using virtual slots} +@end group +@end example + +@sp 3 +This class definition implements two real slots (@code{r} and +@code{i}). Values of the @code{m} and @code{a} virtual slots are +calculated from real slot values. Reading a virtual slot leads to the +application of the function defined in the @code{#:slot-ref} +option. Writing such a slot leads to the application of the function +defined in the @code{#:slot-set!} option. For instance, the following +expression + +@findex #:slot-set! +@findex #:slot-ref +@lisp +(slot-set! c 'a 3) +@end lisp + +permits to set the angle of the @code{c} complex number. This expression +conducts, in fact, to the evaluation of the following expression + +@lisp +((lambda o m) + (let ((m (slot-ref o 'm))) + (slot-set! o 'r (* m (cos a))) + (slot-set! o 'i (* m (sin a)))) + c 3) +@end lisp + +A more complete example is given below: + +@example +@group +@lisp +(define c (make #:r 12 #:i 20)) +(real-part c) @result{} 12 +(angle c) @result{} 1.03037682652431 +(slot-set! c 'i 10) +(set! (real-part c) 1) +(describe c) @result{} + #< 401e9b58> is an instance of class + Slots are: + r = 1 + i = 10 + m = 10.0498756211209 + a = 1.47112767430373 +@end lisp +@end group +@end example + +Since initialization keywords have been defined for the four slots, we +can now define the @code{make-rectangular} and @code{make-polar} standard +Scheme primitives. + +@lisp +(define make-rectangular + (lambda (x y) (make #:r x #:i y))) + +(define make-polar + (lambda (x y) (make #:magn x #:angle y))) +@end lisp + +@node Class precedence list, , Slot description, Inheritance +@subsection Class precedence list + +A class may have more than one superclass. @footnote{This section is an +adaptation of Jeff Dalton's (J.Dalton@@ed.ac.uk) @cite{Brief +introduction to CLOS}} With single inheritance (one superclass), it is +easy to order the super classes from most to least specific. This is the +rule: + +@display +@cartouche +Rule 1: Each class is more specific than its superclasses.@c was \bf +@end cartouche +@end display + +With multiple inheritance, ordering is harder. Suppose we have + +@lisp +(define-class X () + (x #:init-value 1)) + +(define-class Y () + (x #:init-value 2)) + +(define-class Z (X Y) + (@dots{})) +@end lisp + +In this case, the @code{Z} class is more specific than the @code{X} or +@code{Y} class for instances of @code{Z}. However, the @code{#:init-value} +specified in @code{X} and @code{Y} leads to a problem: which one +overrides the other? The rule in @goops{}, as in CLOS, is that the +superclasses listed earlier are more specific than those listed later. +So: + +@display +@cartouche +Rule 2: For a given class, superclasses listed earlier are more + specific than those listed later. +@end cartouche +@end display + +These rules are used to compute a linear order for a class and all its +superclasses, from most specific to least specific. This order is +called the ``class precedence list'' of the class. Given these two +rules, we can claim that the initial form for the @code{x} slot of +previous example is 1 since the class @code{X} is placed before @code{Y} +in class precedence list of @code{Z}. + +These two rules are not always enough to determine a unique order, +however, but they give an idea of how things work. Taking the @code{F} +class shown in Figure@ 1, the class precedence list is + +@example +(f d e a c b ) +@end example + +However, it is usually considered a bad idea for programmers to rely on +exactly what the order is. If the order for some superclasses is important, +it can be expressed directly in the class definition. + +The precedence list of a class can be obtained by the function +@code{class-precedence-list}. This function returns a ordered +list whose first element is the most specific class. For instance, + +@lisp +(class-precedence-list B) @result{} (#< B 401b97c8> + #< 401e4a10> + #< 4026a9d8>) +@end lisp + +However, this result is not too much readable; using the function +@code{class-name} yields a clearer result: + +@lisp +(map class-name (class-precedence-list B)) @result{} (B ) +@end lisp + +@node Generic functions, , Inheritance, Tutorial +@section Generic functions + +@menu +* Generic functions and methods:: +* Next-method:: +* Example:: +@end menu + +@node Generic functions and methods, Next-method, Generic functions, Generic functions +@subsection Generic functions and methods + +@c \label{gf-n-methods} +Neither @goops{} nor CLOS use the message mechanism for methods as most +Object Oriented language do. Instead, they use the notion of +@dfn{generic functions}. A generic function can be seen as a methods +``tanker''. When the evaluator requested the application of a generic +function, all the methods of this generic function will be grabbed and +the most specific among them will be applied. We say that a method +@var{M} is @emph{more specific} than a method @var{M'} if the class of +its parameters are more specific than the @var{M'} ones. To be more +precise, when a generic function must be ``called'' the system will: + +@cindex generic function +@enumerate +@item +search among all the generic function those which are applicable +@item +sort the list of applicable methods in the ``most specific'' order +@item +call the most specific method of this list (i.e. the first method of +the sorted methods list). +@end enumerate + +The definition of a generic function is done with the +@code{define-generic} macro. Definition of a new method is done with the +@code{define-method} macro. Note that @code{define-method} automatically +defines the generic function if it has not been defined +before. Consequently, most of the time, the @code{define-generic} needs +not be used. +@findex define-generic +@findex define-method +Consider the following definitions: + +@lisp +(define-generic G) +(define-method (G (a ) b) 'integer) +(define-method (G (a ) b) 'real) +(define-method (G a b) 'top) +@end lisp + +The @code{define-generic} call defines @var{G} as a generic +function. Note that the signature of the generic function is not given +upon definition, contrarily to CLOS. This will permit methods with +different signatures for a given generic function, as we shall see +later. The three next lines define methods for the @var{G} generic +function. Each method uses a sequence of @dfn{parameter specializers} +that specify when the given method is applicable. A specializer permits +to indicate the class a parameter must belong to (directly or +indirectly) to be applicable. If no specializer is given, the system +defaults it to @code{}. Thus, the first method definition is +equivalent to + +@cindex parameter specializers +@lisp +(define-method (G (a ) (b )) 'integer) +@end lisp + +Now, let us look at some possible calls to generic function @var{G}: + +@lisp +(G 2 3) @result{} integer +(G 2 #t) @result{} integer +(G 1.2 'a) @result{} real +@c (G #3 'a) @result{} real @c was {\sharpsign} +(G #t #f) @result{} top +(G 1 2 3) @result{} error (since no method exists for 3 parameters) +@end lisp + +The preceding methods use only one specializer per parameter list. Of +course, each parameter can use a specializer. In this case, the +parameter list is scanned from left to right to determine the +applicability of a method. Suppose we declare now + +@lisp +(define-method (G (a ) (b )) 'integer-number) +(define-method (G (a ) (b )) 'integer-real) +(define-method (G (a ) (b )) 'integer-integer) +(define-method (G a (b )) 'top-number) +@end lisp + +In this case, + +@lisp +(G 1 2) @result{} integer-integer +(G 1 1.0) @result{} integer-real +(G 1 #t) @result{} integer +(G 'a 1) @result{} top-number +@end lisp + +@node Next-method, Example, Generic functions and methods, Generic functions +@subsection Next-method + +When you call a generic function, with a particular set of arguments, +GOOPS builds a list of all the methods that are applicable to those +arguments and orders them by how closely the method definitions match +the actual argument types. It then calls the method at the top of this +list. If the selected method's code wants to call on to the next method +in this list, it can do so by using @code{next-method}. + +@lisp +(define-method (Test (a )) (cons 'integer (next-method))) +(define-method (Test (a )) (cons 'number (next-method))) +(define-method (Test a) (list 'top)) +@end lisp + +With these definitions, + +@lisp +(Test 1) @result{} (integer number top) +(Test 1.0) @result{} (number top) +(Test #t) @result{} (top) +@end lisp + +@code{next-method} is always called as just @code{(next-method)}. The +arguments for the next method call are always implicit, and always the +same as for the original method call. + +If you want to call on to a method with the same name but with a +different set of arguments (as you might with overloaded methods in C++, +for example), you do not use @code{next-method}, but instead simply +write the new call as usual: + +@lisp +(define-method (Test (a ) min max) + (if (and (>= a min) (<= a max)) + (display "Number is in range\n")) + (Test a)) + +(Test 2 1 10) +@print{} +Number is in range +@result{} +(integer number top) +@end lisp + +(You should be careful in this case that the @code{Test} calls do not +lead to an infinite recursion, but this consideration is just the same +as in Scheme code in general.) + +@node Example, , Next-method, Generic functions +@subsection Example + +In this section we shall continue to define operations on the @code{} +class defined in Figure@ 2. Suppose that we want to use it to implement +complex numbers completely. For instance a definition for the addition of +two complexes could be + +@lisp +(define-method (new-+ (a ) (b )) + (make-rectangular (+ (real-part a) (real-part b)) + (+ (imag-part a) (imag-part b)))) +@end lisp + +To be sure that the @code{+} used in the method @code{new-+} is the standard +addition we can do: + +@lisp +(define-generic new-+) + +(let ((+ +)) + (define-method (new-+ (a ) (b )) + (make-rectangular (+ (real-part a) (real-part b)) + (+ (imag-part a) (imag-part b))))) +@end lisp + +The @code{define-generic} ensures here that @code{new-+} will be defined +in the global environment. Once this is done, we can add methods to the +generic function @code{new-+} which make a closure on the @code{+} +symbol. A complete writing of the @code{new-+} methods is shown in +Figure@ 3. + +@example +@group +@lisp +(define-generic new-+) + +(let ((+ +)) + + (define-method (new-+ (a ) (b )) (+ a b)) + + (define-method (new-+ (a ) (b )) + (make-rectangular (+ a (real-part b)) (imag-part b))) + + (define-method (new-+ (a ) (b )) + (make-rectangular (+ (real-part a) b) (imag-part a))) + + (define-method (new-+ (a ) (b )) + (make-rectangular (+ (real-part a) (real-part b)) + (+ (imag-part a) (imag-part b)))) + + (define-method (new-+ (a )) a) + + (define-method (new-+) 0) + + (define-method (new-+ . args) + (new-+ (car args) + (apply new-+ (cdr args))))) + +(set! + new-+) +@end lisp + +@center @emph{Fig 3: Extending @code{+} for dealing with complex numbers} +@end group +@end example + +@sp 3 +We use here the fact that generic function are not obliged to have the +same number of parameters, contrarily to CLOS. The four first methods +implement the dyadic addition. The fifth method says that the addition +of a single element is this element itself. The sixth method says that +using the addition with no parameter always return 0. The last method +takes an arbitrary number of parameters@footnote{The parameter list for +a @code{define-method} follows the conventions used for Scheme +procedures. In particular it can use the dot notation or a symbol to +denote an arbitrary number of parameters}. This method acts as a kind +of @code{reduce}: it calls the dyadic addition on the @emph{car} of the +list and on the result of applying it on its rest. To finish, the +@code{set!} permits to redefine the @code{+} symbol to our extended +addition. + +@sp 3 +To terminate our implementation (integration?) of complex numbers, we can +redefine standard Scheme predicates in the following manner: + +@lisp +(define-method (complex? c ) #t) +(define-method (complex? c) #f) + +(define-method (number? n ) #t) +(define-method (number? n) #f) +@dots{} +@dots{} +@end lisp + +Standard primitives in which complex numbers are involved could also be +redefined in the same manner. + diff --git a/guile18/doc/goops/goops.texi b/guile18/doc/goops/goops.texi new file mode 100644 index 0000000000..d6d8e595d4 --- /dev/null +++ b/guile18/doc/goops/goops.texi @@ -0,0 +1,2905 @@ +\input texinfo +@c -*-texinfo-*- +@c %**start of header +@setfilename goops.info +@settitle Goops Manual +@set goops +@setchapternewpage odd +@paragraphindent 0 +@c %**end of header + +@set VERSION 0.3 + +@dircategory The Algorithmic Language Scheme +@direntry +* GOOPS: (goops). The GOOPS reference manual. +@end direntry + +@macro goops +GOOPS +@end macro + +@macro guile +Guile +@end macro + +@ifinfo +This file documents GOOPS, an object oriented extension for Guile. + +Copyright (C) 1999, 2000, 2001, 2003, 2006 Free Software Foundation + +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. + +@end ifinfo + +@c This title page illustrates only one of the +@c two methods of forming a title page. + +@titlepage +@title Goops Manual +@subtitle For use with GOOPS @value{VERSION} + +@c AUTHORS + +@c The GOOPS tutorial was written by Christian Lynbech and Mikael +@c Djurfeldt, who also wrote GOOPS itself. The GOOPS reference manual +@c and MOP documentation were written by Neil Jerram and reviewed by +@c Mikael Djurfeldt. + +@author Christian Lynbech +@author @email{chl@@tbit.dk} +@author +@author Mikael Djurfeldt +@author @email{djurfeldt@@nada.kth.se} +@author +@author Neil Jerram +@author @email{neil@@ossau.uklinux.net} + +@c The following two commands +@c start the copyright page. +@page +@vskip 0pt plus 1filll +Copyright @copyright{} 1999, 2006 Free Software Foundation + +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. + +@end titlepage + +@node Top, Introduction, (dir), (dir) + +@menu +* Introduction:: +* Getting Started:: +* Reference Manual:: +* MOP Specification:: + +* Tutorial:: + +* Concept Index:: +* Function and Variable Index:: +@end menu + +@iftex +@chapter Preliminaries +@end iftex + +@node Introduction, Getting Started, Top, Top +@iftex +@section Introduction +@end iftex +@ifnottex +@chapter Introduction +@end ifnottex + +@goops{} is the object oriented extension to @guile{}. Its +implementation is derived from @w{STk-3.99.3} by Erick Gallesio and +version 1.3 of Gregor Kiczales @cite{Tiny-Clos}. It is very close in +spirit to CLOS, the Common Lisp Object System (@cite{CLtL2}) but is +adapted for the Scheme language. While GOOPS is not compatible with any +of these systems, GOOPS contains a compatibility module which allows for +execution of STKlos programs. + +Briefly stated, the @goops{} extension gives the user a full object +oriented system with multiple inheritance and generic functions with +multi-method dispatch. Furthermore, the implementation relies on a true +meta object protocol, in the spirit of the one defined for CLOS +(@cite{Gregor Kiczales: A Metaobject Protocol}). + +@node Getting Started, Reference Manual, Introduction, Top +@iftex +@section Getting Started +@end iftex +@ifnottex +@chapter Getting Started +@end ifnottex + +@menu +* Running GOOPS:: + +Examples of some basic GOOPS functionality. + +* Methods:: +* User-defined types:: +* Asking for the type of an object:: + +See further in the GOOPS tutorial available in this distribution in +info (goops.info) and texinfo format. +@end menu + +@node Running GOOPS, Methods, Getting Started, Getting Started +@subsection Running GOOPS + +@enumerate +@item +Type + +@smalllisp +guile-oops +@end smalllisp + +You should now be at the Guile prompt ("guile> "). + +@item +Type + +@smalllisp +(use-modules (oop goops)) +@end smalllisp + +to load GOOPS. (If your system supports dynamic loading, you +should be able to do this not only from `guile-oops' but from an +arbitrary Guile interpreter.) +@end enumerate + +We're now ready to try some basic GOOPS functionality. + +@node Methods, User-defined types, Running GOOPS, Getting Started +@subsection Methods + +@smalllisp +@group +(define-method (+ (x ) (y )) + (string-append x y)) + +(+ 1 2) --> 3 +(+ "abc" "de") --> "abcde" +@end group +@end smalllisp + +@node User-defined types, Asking for the type of an object, Methods, Getting Started +@subsection User-defined types + +@smalllisp +(define-class <2D-vector> () + (x #:init-value 0 #:accessor x-component #:init-keyword #:x) + (y #:init-value 0 #:accessor y-component #:init-keyword #:y)) + +@group +(use-modules (ice-9 format)) + +(define-method (write (obj <2D-vector>) port) + (display (format #f "<~S, ~S>" (x-component obj) (y-component obj)) + port)) + +(define v (make <2D-vector> #:x 3 #:y 4)) + +v --> <3, 4> +@end group + +@group +(define-method (+ (x <2D-vector>) (y <2D-vector>)) + (make <2D-vector> + #:x (+ (x-component x) (x-component y)) + #:y (+ (y-component x) (y-component y)))) + +(+ v v) --> <6, 8> +@end group +@end smalllisp + +@node Asking for the type of an object, , User-defined types, Getting Started +@subsection Types + +@example +(class-of v) --> #< <2D-vector> 40241ac0> +<2D-vector> --> #< <2D-vector> 40241ac0> +(class-of 1) --> #< 401b2a98> + --> #< 401b2a98> + +(is-a? v <2D-vector>) --> #t +@end example + +@node Reference Manual, MOP Specification, Getting Started, Top +@chapter Reference Manual + +This chapter is the GOOPS reference manual. It aims to describe all the +syntax, procedures, options and associated concepts that a typical +application author would need to understand in order to use GOOPS +effectively in their application. It also describes what is meant by +the GOOPS ``metaobject protocol'' (aka ``MOP''), and indicates how +authors can use the metaobject protocol to customize the behaviour of +GOOPS itself. + +For a detailed specification of the GOOPS metaobject protocol, see +@ref{MOP Specification}. + +@menu +* Introductory Remarks:: +* Defining New Classes:: +* Creating Instances:: +* Accessing Slots:: +* Creating Generic Functions:: +* Adding Methods to Generic Functions:: +* Invoking Generic Functions:: +* Redefining a Class:: +* Changing the Class of an Instance:: +* Introspection:: +* Miscellaneous Functions:: +@end menu + +@node Introductory Remarks +@section Introductory Remarks + +GOOPS is an object-oriented programming system based on a ``metaobject +protocol'' derived from the ones used in CLOS (the Common Lisp Object +System), tiny-clos (a small Scheme implementation of a subset of CLOS +functionality) and STKlos. + +GOOPS can be used by application authors at a basic level without any +need to understand what the metaobject protocol (aka ``MOP'') is and how +it works. On the other hand, the MOP underlies even the customizations +that application authors are likely to make use of very quickly --- such +as defining an @code{initialize} method to customize the initialization +of instances of an application-defined class --- and an understanding of +the MOP makes it much easier to explain such customizations in a precise +way. And in the long run, understanding the MOP is the key both to +understanding GOOPS at a deeper level and to taking full advantage of +GOOPS' power, by customizing the behaviour of GOOPS itself. + +Each of the following sections of the reference manual is arranged +such that the most basic usage is introduced first, and then subsequent +subsections discuss the related internal functions and metaobject +protocols, finishing with a description of how to customize that area of +functionality. + +These introductory remarks continue with a few words about metaobjects +and the MOP. Readers who do not want to be bothered yet with the MOP +and customization could safely skip this subsection on a first reading, +and should correspondingly skip subsequent subsections that are +concerned with internals and customization. + +In general, this reference manual assumes familiarity with standard +object oriented concepts and terminology. However, some of the terms +used in GOOPS are less well known, so the Terminology subsection +provides definitions for these terms. + +@menu +* Metaobjects and the Metaobject Protocol:: +* Terminology:: +@end menu + +@node Metaobjects and the Metaobject Protocol +@subsection Metaobjects and the Metaobject Protocol + +The conceptual building blocks of GOOPS are classes, slot definitions, +instances, generic functions and methods. A class is a grouping of +inheritance relations and slot definitions. An instance is an object +with slots that are allocated following the rules implied by its class's +superclasses and slot definitions. A generic function is a collection +of methods and rules for determining which of those methods to apply +when the generic function is invoked. A method is a procedure and a set +of specializers that specify the type of arguments to which the +procedure is applicable. + +Of these entities, GOOPS represents classes, generic functions and +methods as ``metaobjects''. In other words, the values in a GOOPS +program that describe classes, generic functions and methods, are +themselves instances (or ``objects'') of special GOOPS classes that +encapsulate the behaviour, respectively, of classes, generic functions, +and methods. + +(The other two entities are slot definitions and instances. Slot +definitions are not strictly instances, but every slot definition is +associated with a GOOPS class that specifies the behaviour of the slot +as regards accessibility and protection from garbage collection. +Instances are of course objects in the usual sense, and there is no +benefit from thinking of them as metaobjects.) + +The ``metaobject protocol'' (aka ``MOP'') is the specification of the +generic functions which determine the behaviour of these metaobjects and +the circumstances in which these generic functions are invoked. + +For a concrete example of what this means, consider how GOOPS calculates +the set of slots for a class that is being defined using +@code{define-class}. The desired set of slots is the union of the new +class's direct slots and the slots of all its superclasses. But +@code{define-class} itself does not perform this calculation. Instead, +there is a method of the @code{initialize} generic function that is +specialized for instances of type @code{}, and it is this method +that performs the slot calculation. + +@code{initialize} is a generic function which GOOPS calls whenever a new +instance is created, immediately after allocating memory for a new +instance, in order to initialize the new instance's slots. The sequence +of steps is as follows. + +@itemize @bullet +@item +@code{define-class} uses @code{make} to make a new instance of the +@code{}, passing as initialization arguments the superclasses, +slot definitions and class options that were specified in the +@code{define-class} form. + +@item +@code{make} allocates memory for the new instance, and then invokes the +@code{initialize} generic function to initialize the new instance's +slots. + +@item +The @code{initialize} generic function applies the method that is +specialized for instances of type @code{}, and this method +performs the slot calculation. +@end itemize + +In other words, rather than being hardcoded in @code{define-class}, the +behaviour of class definition is encapsulated by generic function +methods that are specialized for the class @code{}. + +It is possible to create a new class that inherits from @code{}, +which is called a ``metaclass'', and to write a new @code{initialize} +method that is specialized for instances of the new metaclass. Then, if +the @code{define-class} form includes a @code{#:metaclass} class option +whose value is the new metaclass, the class that is defined by the +@code{define-class} form will be an instance of the new metaclass rather +than of the default @code{}, and will be defined in accordance +with the new @code{initialize} method. Thus the default slot +calculation, as well as any other aspect of the new class's relationship +with its superclasses, can be modified or overridden. + +In a similar way, the behaviour of generic functions can be modified or +overridden by creating a new class that inherits from the standard +generic function class @code{}, writing appropriate methods +that are specialized to the new class, and creating new generic +functions that are instances of the new class. + +The same is true for method metaobjects. And the same basic mechanism +allows the application class author to write an @code{initialize} method +that is specialized to their application class, to initialize instances +of that class. + +Such is the power of the MOP. Note that @code{initialize} is just one +of a large number of generic functions that can be customized to modify +the behaviour of application objects and classes and of GOOPS itself. +Each subsequent section of the reference manual covers a particular area +of GOOPS functionality, and describes the generic functions that are +relevant for customization of that area. + +We conclude this subsection by emphasizing a point that may seem +obvious, but contrasts with the corresponding situation in some other +MOP implementations, such as CLOS. The point is simply that an +identifier which represents a GOOPS class or generic function is a +variable with a first-class value, the value being an instance of class +@code{} or @code{}. (In CLOS, on the other hand, a +class identifier is a symbol that indexes the corresponding class +metaobject in a separate namespace for classes.) This is, of course, +simply an extension of the tendency in Scheme to avoid the unnecessary +use of, on the one hand, syntactic forms that require unevaluated +arguments and, on the other, separate identifier namespaces (e.g. for +class names), but it is worth noting that GOOPS conforms fully to this +Schemely principle. + +@node Terminology +@subsection Terminology + +It is assumed that the reader is already familiar with standard object +orientation concepts such as classes, objects/instances, +inheritance/subclassing, generic functions and methods, encapsulation +and polymorphism. + +This section explains some of the less well known concepts and +terminology that GOOPS uses, which are assumed by the following sections +of the reference manual. + +@menu +* Metaclass:: +* Class Precedence List:: +* Accessor:: +@end menu + +@node Metaclass +@subsubsection Metaclass + +A @dfn{metaclass} is the class of an object which represents a GOOPS +class. Put more succinctly, a metaclass is a class's class. + +Most GOOPS classes have the metaclass @code{} and, by default, +any new class that is created using @code{define-class} has the +metaclass @code{}. + +But what does this really mean? To find out, let's look in more detail +at what happens when a new class is created using @code{define-class}: + +@example +(define-class () . slots) +@end example + +GOOPS actually expands the @code{define-class} form to something like +this + +@example +(define (class () . slots)) +@end example + +and thence to + +@example +(define + (make #:supers (list ) #:slots slots)) +@end example + +In other words, the value of @code{} is in fact an instance of +the class @code{} with slot values specifying the superclasses +and slot definitions for the class @code{}. (@code{#:supers} +and @code{#:slots} are initialization keywords for the @code{dsupers} +and @code{dslots} slots of the @code{} class.) + +In order to take advantage of the full power of the GOOPS metaobject +protocol (@pxref{MOP Specification}), it is sometimes desirable to +create a new class with a metaclass other than the default +@code{}. This is done by writing: + +@example +(define-class () + slot @dots{} + #:metaclass ) +@end example + +GOOPS expands this to something like: + +@example +(define + (make #:supers (list ) #:slots slots)) +@end example + +In this case, the value of @code{} is an instance of the more +specialized class @code{}. Note that +@code{} itself must previously have been defined as a +subclass of @code{}. For a full discussion of when and how it is +useful to define new metaclasses, see @ref{MOP Specification}. + +Now let's make an instance of @code{}: + +@example +(define my-object (make ...)) +@end example + +All of the following statements are correct expressions of the +relationships between @code{my-object}, @code{}, +@code{} and @code{}. + +@itemize @bullet +@item +@code{my-object} is an instance of the class @code{}. + +@item +@code{} is an instance of the class @code{}. + +@item +@code{} is an instance of the class @code{}. + +@item +The class of @code{my-object} is @code{}. + +@item +The metaclass of @code{my-object} is @code{}. + +@item +The class of @code{} is @code{}. + +@item +The metaclass of @code{} is @code{}. + +@item +The class of @code{} is @code{}. + +@item +The metaclass of @code{} is @code{}. + +@item +@code{} is not a metaclass, since it is does not inherit from +@code{}. + +@item +@code{} is a metaclass, since it inherits from +@code{}. +@end itemize + +@node Class Precedence List +@subsubsection Class Precedence List + +The @dfn{class precedence list} of a class is the list of all direct and +indirect superclasses of that class, including the class itself. + +In the absence of multiple inheritance, the class precedence list is +ordered straightforwardly, beginning with the class itself and ending +with @code{}. + +For example, given this inheritance hierarchy: + +@example +(define-class () @dots{}) +(define-class () @dots{}) +(define-class () @dots{}) +@end example + +the class precedence list of would be + +@example +( ) +@end example + +With multiple inheritance, the algorithm is a little more complicated. +A full description is provided by the GOOPS Tutorial: see @ref{Class +precedence list}. + +``Class precedence list'' is often abbreviated, in documentation and +Scheme variable names, to @dfn{cpl}. + +@node Accessor +@subsubsection Accessor + +An @dfn{accessor} is a generic function with both reference and setter +methods. + +@example +(define-accessor perimeter) +@end example + +Reference methods for an accessor are defined in the same way as generic +function methods. + +@example +(define-method (perimeter (s )) + (* 4 (side-length s))) +@end example + +Setter methods for an accessor are defined by specifying ``(setter +)'' as the first parameter of the @code{define-method} +call. + +@example +(define-method ((setter perimeter) (s ) (n )) + (set! (side-length s) (/ n 4))) +@end example + +Once an appropriate setter method has been defined in this way, it can +be invoked using the generalized @code{set!} syntax, as in: + +@example +(set! (perimeter s1) 18.3) +@end example + +@node Defining New Classes +@section Defining New Classes + +[ *fixme* Somewhere in this manual there needs to be an introductory +discussion about GOOPS classes, generic functions and methods, covering + +@itemize @bullet +@item +how classes encapsulate related items of data in @dfn{slots} + +@item +why it is that, unlike in C++ and Java, a class does not encapsulate the +methods that act upon the class (at least not in the C++/Java sense) + +@item +how generic functions provide a more general solution that provides for +dispatch on all argument types, and avoids idiosyncracies like C++'s +friend classes + +@item +how encapsulation in the sense of data- and code-hiding, or of +distinguishing interface from implementation, is treated in Guile as an +orthogonal concept to object orientation, and is the responsibility of +the module system. +@end itemize + +Some of this is covered in the Tutorial chapter, in @ref{Generic +functions and methods} - perhaps the best solution would be to expand +the discussion there. ] + +@menu +* Basic Class Definition:: +* Class Options:: +* Slot Options:: +* Class Definition Internals:: +* Customizing Class Definition:: +* STKlos Compatibility:: +@end menu + +@node Basic Class Definition +@subsection Basic Class Definition + +New classes are defined using the @code{define-class} syntax, with +arguments that specify the classes that the new class should inherit +from, the direct slots of the new class, and any required class options. + +@deffn syntax define-class name (super @dots{}) slot-definition @dots{} . options +Define a class called @var{name} that inherits from @var{super}s, with +direct slots defined by @var{slot-definition}s and class options +@var{options}. The newly created class is bound to the variable name +@var{name} in the current environment. + +Each @var{slot-definition} is either a symbol that names the slot or a +list, + +@example +(@var{slot-name-symbol} . @var{slot-options}) +@end example + +where @var{slot-name-symbol} is a symbol and @var{slot-options} is a +list with an even number of elements. The even-numbered elements of +@var{slot-options} (counting from zero) are slot option keywords; the +odd-numbered elements are the corresponding values for those keywords. + +@var{options} is a similarly structured list containing class option +keywords and corresponding values. +@end deffn + +The standard GOOPS class and slot options are described in the following +subsections: see @ref{Class Options} and @ref{Slot Options}. + +Example 1. Define a class that combines two pre-existing classes by +inheritance but adds no new slots. + +@example +(define-class ( )) +@end example + +Example 2. Define a @code{regular-polygon} class with slots for side +length and number of sides that have default values and can be accessed +via the generic functions @code{side-length} and @code{num-sides}. + +@example +(define-class () + (sl #:init-value 1 #:accessor side-length) + (ns #:init-value 5 #:accessor num-sides)) +@end example + +Example 3. Define a class whose behavior (and that of its instances) is +customized via an application-defined metaclass. + +@example +(define-class () + (s #:init-value #f #:accessor state) + ... + #:metaclass ) +@end example + +@node Class Options +@subsection Class Options + +@deffn {class option} #:metaclass metaclass +The @code{#:metaclass} class option specifies the metaclass of the class +being defined. @var{metaclass} must be a class that inherits from +@code{}. For an introduction to the use of metaclasses, see +@ref{Metaobjects and the Metaobject Protocol} and @ref{Metaclass}. + +If the @code{#:metaclass} option is absent, GOOPS reuses or constructs a +metaclass for the new class by calling @code{ensure-metaclass} +(@pxref{Class Definition Internals,, ensure-metaclass}). +@end deffn + +@deffn {class option} #:name name +The @code{#:name} class option specifies the new class's name. This +name is used to identify the class whenever related objects - the class +itself, its instances and its subclasses - are printed. + +If the @code{#:name} option is absent, GOOPS uses the first argument to +@code{define-class} as the class name. +@end deffn + +@deffn {class option} #:environment environment +*fixme* Not sure about this one, but I think that the +@code{#:environment} option specifies the environment in which the +class's getters and setters are computed and evaluated. + +If the @code{#:environment} option is not specified, the class's +environment defaults to the top-level environment in which the +@code{define-class} form appears. +@end deffn + +@node Slot Options +@subsection Slot Options + +@deffn {slot option} #:allocation allocation +The @code{#:allocation} option tells GOOPS how to allocate storage for +the slot. Possible values for @var{allocation} are + +@itemize @bullet +@item @code{#:instance} + +Indicates that GOOPS should create separate storage for this slot in +each new instance of the containing class (and its subclasses). + +@item @code{#:class} + +Indicates that GOOPS should create storage for this slot that is shared +by all instances of the containing class (and its subclasses). In other +words, a slot in class @var{C} with allocation @code{#:class} is shared +by all @var{instance}s for which @code{(is-a? @var{instance} @var{c})}. + +@item @code{#:each-subclass} + +Indicates that GOOPS should create storage for this slot that is shared +by all @emph{direct} instances of the containing class, and that +whenever a subclass of the containing class is defined, GOOPS should +create a new storage for the slot that is shared by all @emph{direct} +instances of the subclass. In other words, a slot with allocation +@code{#:each-subclass} is shared by all instances with the same +@code{class-of}. + +@item @code{#:virtual} + +Indicates that GOOPS should not allocate storage for this slot. The +slot definition must also include the @code{#:slot-ref} and +@code{#:slot-set!} options to specify how to reference and set the value +for this slot. +@end itemize + +The default value is @code{#:instance}. + +Slot allocation options are processed when defining a new class by the +generic function @code{compute-get-n-set}, which is specialized by the +class's metaclass. Hence new types of slot allocation can be +implemented by defining a new metaclass and a method for +@code{compute-get-n-set} that is specialized for the new metaclass. For +an example of how to do this, see @ref{Customizing Class Definition}. +@end deffn + +@deffn {slot option} #:slot-ref getter +@deffnx {slot option} #:slot-set! setter +The @code{#:slot-ref} and @code{#:slot-set!} options must be specified +if the slot allocation is @code{#:virtual}, and are ignored otherwise. + +@var{getter} should be a closure taking a single @var{instance} parameter +that returns the current slot value. @var{setter} should be a closure +taking two parameters - @var{instance} and @var{new-val} - that sets the +slot value to @var{new-val}. +@end deffn + +@deffn {slot option} #:getter getter +@deffnx {slot option} #:setter setter +@deffnx {slot option} #:accessor accessor +These options, if present, tell GOOPS to create generic function and +method definitions that can be used to get and set the slot value more +conveniently than by using @code{slot-ref} and @code{slot-set!}. + +@var{getter} specifies a generic function to which GOOPS will add a +method for getting the slot value. @var{setter} specifies a generic +function to which GOOPS will add a method for setting the slot value. +@var{accessor} specifies an accessor to which GOOPS will add methods for +both getting and setting the slot value. + +So if a class includes a slot definition like this: + +@example +(c #:getter get-count #:setter set-count #:accessor count) +@end example + +GOOPS defines generic function methods such that the slot value can be +referenced using either the getter or the accessor - + +@example +(let ((current-count (get-count obj))) @dots{}) +(let ((current-count (count obj))) @dots{}) +@end example + +- and set using either the setter or the accessor - + +@example +(set-count obj (+ 1 current-count)) +(set! (count obj) (+ 1 current-count)) +@end example + +Note that + +@itemize @bullet +@item +with an accessor, the slot value is set using the generalized +@code{set!} syntax + +@item +in practice, it is unusual for a slot to use all three of these options: +read-only, write-only and read-write slots would typically use only +@code{#:getter}, @code{#:setter} and @code{#:accessor} options +respectively. +@end itemize + +If the specified names are already bound in the top-level environment to +values that cannot be upgraded to generic functions, those values are +overwritten during evaluation of the @code{define-class} that contains +the slot definition. For details, see @ref{Generic Function Internals,, +ensure-generic}. +@end deffn + +@deffn {slot option} #:init-value init-value +@deffnx {slot option} #:init-form init-form +@deffnx {slot option} #:init-thunk init-thunk +@deffnx {slot option} #:init-keyword init-keyword +These options provide various ways to specify how to initialize the +slot's value at instance creation time. @var{init-value} is a fixed +value (shared across all new instances of the class). +@var{init-thunk} is a procedure of no arguments that is called +when a new instance is created and should return the desired initial +slot value. @var{init-form} is an unevaluated expression that gets +evaluated when a new instance is created and should return the desired +initial slot value. @var{init-keyword} is a keyword that can be used +to pass an initial slot value to @code{make} when creating a new +instance. + +Note that, since an @code{init-value} value is shared across all +instances of a class, you should only use it when the initial value is +an immutable value, like a constant. If you want to initialize a slot +with a fresh, independently mutable value, you should use +@code{init-thunk} or @code{init-form} instead. Consider the following +example. + +@example +(define-class () + (hashtab #:init-value (make-hash-table))) +@end example + +@noindent +Here only one hash table is created and all instances of +@code{} have their @code{hashtab} slot refer to it. In order +to have each instance of @code{} refer to a new hash table, you +should instead write: + +@example +(define-class () + (hashtab #:init-thunk make-hash-table)) +@end example + +@noindent +or: + +@example +(define-class () + (hashtab #:init-form (make-hash-table))) +@end example + +If more than one of these options is specified for the same slot, the +order of precedence, highest first is + +@itemize @bullet +@item +@code{#:init-keyword}, if @var{init-keyword} is present in the options +passed to @code{make} + +@item +@code{#:init-thunk}, @code{#:init-form} or @code{#:init-value}. +@end itemize + +If the slot definition contains more than one initialization option of +the same precedence, the later ones are ignored. If a slot is not +initialized at all, its value is unbound. + +In general, slots that are shared between more than one instance are +only initialized at new instance creation time if the slot value is +unbound at that time. However, if the new instance creation specifies +a valid init keyword and value for a shared slot, the slot is +re-initialized regardless of its previous value. + +Note, however, that the power of GOOPS' metaobject protocol means that +everything written here may be customized or overridden for particular +classes! The slot initializations described here are performed by the least +specialized method of the generic function @code{initialize}, whose +signature is + +@example +(define-method (initialize (object ) initargs) ...) +@end example + +The initialization of instances of any given class can be customized by +defining a @code{initialize} method that is specialized for that class, +and the author of the specialized method may decide to call +@code{next-method} - which will result in a call to the next less +specialized @code{initialize} method - at any point within the +specialized code, or maybe not at all. In general, therefore, the +initialization mechanisms described here may be modified or overridden by +more specialized code, or may not be supported at all for particular +classes. +@end deffn + +@node Class Definition Internals +@subsection Class Definition Internals + +Implementation notes: @code{define-class} expands to an expression which + +@itemize @bullet +@item +checks that it is being evaluated only at top level + +@item +defines any accessors that are implied by the @var{slot-definition}s + +@item +uses @code{class} to create the new class (@pxref{Class Definition +Internals,, class}) + +@item +checks for a previous class definition for @var{name} and, if found, +handles the redefinition by invoking @code{class-redefinition} +(@pxref{Redefining a Class}). +@end itemize + +@deffn syntax class name (super @dots{}) slot-definition @dots{} . options +Return a newly created class that inherits from @var{super}s, with +direct slots defined by @var{slot-definition}s and class options +@var{options}. For the format of @var{slot-definition}s and +@var{options}, see @ref{Basic Class Definition,, define-class}. +@end deffn + +Implementation notes: @code{class} expands to an expression which + +@itemize @bullet +@item +processes the class and slot definition options to check that they are +well-formed, to convert the @code{#:init-form} option to an +@code{#:init-thunk} option, to supply a default environment parameter +(the current top-level environment) and to evaluate all the bits that +need to be evaluated + +@item +calls @code{make-class} to create the class with the processed and +evaluated parameters. +@end itemize + +@deffn procedure make-class supers slots . options +Return a newly created class that inherits from @var{supers}, with +direct slots defined by @var{slots} and class options @var{options}. +For the format of @var{slots} and @var{options}, see @ref{Basic Class +Definition,, define-class}, except note that for @code{make-class}, +@var{slots} and @var{options} are separate list parameters: @var{slots} +here is a list of slot definitions. +@end deffn + +Implementation notes: @code{make-class} + +@itemize @bullet +@item +adds @code{} to the @var{supers} list if @var{supers} is empty +or if none of the classes in @var{supers} have @code{} in their +class precedence list + +@item +defaults the @code{#:environment}, @code{#:name} and @code{#:metaclass} +options, if they are not specified by @var{options}, to the current +top-level environment, the unbound value, and @code{(ensure-metaclass +@var{supers})} respectively (@pxref{Class Definition Internals,, +ensure-metaclass}) + +@item +checks for duplicate classes in @var{supers} and duplicate slot names in +@var{slots}, and signals an error if there are any duplicates + +@item +calls @code{make}, passing the metaclass as the first parameter and all +other parameters as option keywords with values. +@end itemize + +@deffn procedure ensure-metaclass supers env +Return a metaclass suitable for a class that inherits from the list of +classes in @var{supers}. The returned metaclass is the union by +inheritance of the metaclasses of the classes in @var{supers}. + +In the simplest case, where all the @var{supers} are straightforward +classes with metaclass @code{}, the returned metaclass is just +@code{}. + +For a more complex example, suppose that @var{supers} contained one +class with metaclass @code{} and one with metaclass +@code{}. Then the returned metaclass would be a +class that inherits from both @code{} and +@code{}. + +If @var{supers} is the empty list, @code{ensure-metaclass} returns the +default GOOPS metaclass @code{}. + +GOOPS keeps a list of the metaclasses created by +@code{ensure-metaclass}, so that each required type of metaclass only +has to be created once. + +The @code{env} parameter is ignored. +@end deffn + +@deffn procedure ensure-metaclass-with-supers meta-supers +@code{ensure-metaclass-with-supers} is an internal procedure used by +@code{ensure-metaclass} (@pxref{Class Definition Internals,, +ensure-metaclass}). It returns a metaclass that is the union by +inheritance of the metaclasses in @var{meta-supers}. +@end deffn + +The internals of @code{make}, which is ultimately used to create the new +class object, are described in @ref{Customizing Instance Creation}, +which covers the creation and initialization of instances in general. + +@node Customizing Class Definition +@subsection Customizing Class Definition + +During the initialization of a new class, GOOPS calls a number of generic +functions with the newly allocated class instance as the first +argument. Specifically, GOOPS calls the generic function + +@itemize @bullet +@item +(initialize @var{class} @dots{}) +@end itemize + +where @var{class} is the newly allocated class instance, and the default +@code{initialize} method for arguments of type @code{} calls the +generic functions + +@itemize @bullet +@item +(compute-cpl @var{class}) + +@item +(compute-slots @var{class}) + +@item +(compute-get-n-set @var{class} @var{slot-def}), for each of the slot +definitions returned by @code{compute-slots} + +@item +(compute-getter-method @var{class} @var{slot-def}), for each of the +slot definitions returned by @code{compute-slots} that includes a +@code{#:getter} or @code{#:accessor} slot option + +@item +(compute-setter-method @var{class} @var{slot-def}), for each of the +slot definitions returned by @code{compute-slots} that includes a +@code{#:setter} or @code{#:accessor} slot option. +@end itemize + +If the metaclass of the new class is something more specialized than the +default @code{}, then the type of @var{class} in the calls above +is more specialized than @code{}, and hence it becomes possible +to define generic function methods, specialized for the new class's +metaclass, that can modify or override the default behaviour of +@code{initialize}, @code{compute-cpl} or @code{compute-get-n-set}. + +@code{compute-cpl} computes the class precedence list (``CPL'') for the +new class (@pxref{Class precedence list}), and returns it as a list of +class objects. The CPL is important because it defines a superclass +ordering that is used, when a generic function is invoked upon an +instance of the class, to decide which of the available generic function +methods is the most specific. Hence @code{compute-cpl} could be +customized in order to modify the CPL ordering algorithm for all classes +with a special metaclass. + +The default CPL algorithm is encapsulated by the @code{compute-std-cpl} +procedure, which is in turn called by the default @code{compute-cpl} +method. + +@deffn procedure compute-std-cpl class +Compute and return the class precedence list for @var{class} according +to the algorithm described in @ref{Class precedence list}. +@end deffn + +@code{compute-slots} computes and returns a list of all slot definitions +for the new class. By default, this list includes the direct slot +definitions from the @code{define-class} form, plus the slot definitions +that are inherited from the new class's superclasses. The default +@code{compute-slots} method uses the CPL computed by @code{compute-cpl} +to calculate this union of slot definitions, with the rule that slots +inherited from superclasses are shadowed by direct slots with the same +name. One possible reason for customizing @code{compute-slots} would be +to implement an alternative resolution strategy for slot name conflicts. + +@code{compute-get-n-set} computes the low-level closures that will be +used to get and set the value of a particular slot, and returns them in +a list with two elements. + +The closures returned depend on how storage for that slot is allocated. +The standard @code{compute-get-n-set} method, specialized for classes of +type @code{}, handles the standard GOOPS values for the +@code{#:allocation} slot option (@pxref{Slot Options,, allocation}). By +defining a new @code{compute-get-n-set} method for a more specialized +metaclass, it is possible to support new types of slot allocation. + +Suppose you wanted to create a large number of instances of some class +with a slot that should be shared between some but not all instances of +that class - say every 10 instances should share the same slot storage. +The following example shows how to implement and use a new type of slot +allocation to do this. + +@example +(define-class ()) + +(let ((batch-allocation-count 0) + (batch-get-n-set #f)) + (define-method (compute-get-n-set (class ) s) + (case (slot-definition-allocation s) + ((#:batched) + ;; If we've already used the same slot storage for 10 instances, + ;; reset variables. + (if (= batch-allocation-count 10) + (begin + (set! batch-allocation-count 0) + (set! batch-get-n-set #f))) + ;; If we don't have a current pair of get and set closures, + ;; create one. make-closure-variable returns a pair of closures + ;; around a single Scheme variable - see goops.scm for details. + (or batch-get-n-set + (set! batch-get-n-set (make-closure-variable))) + ;; Increment the batch allocation count. + (set! batch-allocation-count (+ batch-allocation-count 1)) + batch-get-n-set) + + ;; Call next-method to handle standard allocation types. + (else (next-method))))) + +(define-class () + ... + (c #:allocation #:batched) + ... + #:metaclass ) +@end example + +The usage of @code{compute-getter-method} and @code{compute-setter-method} +is described in @ref{MOP Specification}. + +@code{compute-cpl} and @code{compute-get-n-set} are called by the +standard @code{initialize} method for classes whose metaclass is +@code{}. But @code{initialize} itself can also be modified, by +defining an @code{initialize} method specialized to the new class's +metaclass. Such a method could complete override the standard +behaviour, by not calling @code{(next-method)} at all, but more +typically it would perform additional class initialization steps before +and/or after calling @code{(next-method)} for the standard behaviour. + +@node STKlos Compatibility +@subsection STKlos Compatibility + +If the STKlos compatibility module is loaded, @code{define-class} is +overwritten by a STKlos-specific definition; the standard GOOPS +definition of @code{define-class} remains available in +@code{standard-define-class}. + +@deffn syntax standard-define-class name (super @dots{}) slot-definition @dots{} . options +@code{standard-define-class} is equivalent to the standard GOOPS +@code{define-class}. +@end deffn + +@node Creating Instances +@section Creating Instances + +@menu +* Basic Instance Creation:: +* Customizing Instance Creation:: +@end menu + +@node Basic Instance Creation +@subsection Basic Instance Creation + +To create a new instance of any GOOPS class, use the generic function +@code{make} or @code{make-instance}, passing the required class and any +appropriate instance initialization arguments as keyword and value +pairs. Note that @code{make} and @code{make-instances} are aliases for +each other - their behaviour is identical. + +@deffn generic make +@deffnx method make (class ) . initargs +Create and return a new instance of class @var{class}, initialized using +@var{initargs}. + +In theory, @var{initargs} can have any structure that is understood by +whatever methods get applied when the @code{initialize} generic function +is applied to the newly allocated instance. + +In practice, specialized @code{initialize} methods would normally call +@code{(next-method)}, and so eventually the standard GOOPS +@code{initialize} methods are applied. These methods expect +@var{initargs} to be a list with an even number of elements, where +even-numbered elements (counting from zero) are keywords and +odd-numbered elements are the corresponding values. + +GOOPS processes initialization argument keywords automatically for slots +whose definition includes the @code{#:init-keyword} option (@pxref{Slot +Options,, init-keyword}). Other keyword value pairs can only be +processed by an @code{initialize} method that is specialized for the new +instance's class. Any unprocessed keyword value pairs are ignored. +@end deffn + +@deffn generic make-instance +@deffnx method make-instance (class ) . initargs +@code{make-instance} is an alias for @code{make}. +@end deffn + +@node Customizing Instance Creation +@subsection Customizing Instance Creation + +@code{make} itself is a generic function. Hence the @code{make} +invocation itself can be customized in the case where the new instance's +metaclass is more specialized than the default @code{}, by +defining a @code{make} method that is specialized to that metaclass. + +Normally, however, the method for classes with metaclass @code{} +will be applied. This method calls two generic functions: + +@itemize @bullet +@item +(allocate-instance @var{class} . @var{initargs}) + +@item +(initialize @var{instance} . @var{initargs}) +@end itemize + +@code{allocate-instance} allocates storage for and returns the new +instance, uninitialized. You might customize @code{allocate-instance}, +for example, if you wanted to provide a GOOPS wrapper around some other +object programming system. + +To do this, you would create a specialized metaclass, which would act as +the metaclass for all classes and instances from the other system. Then +define an @code{allocate-instance} method, specialized to that +metaclass, which calls a Guile primitive C function, which in turn +allocates the new instance using the interface of the other object +system. + +In this case, for a complete system, you would also need to customize a +number of other generic functions like @code{make} and +@code{initialize}, so that GOOPS knows how to make classes from the +other system, access instance slots, and so on. + +@code{initialize} initializes the instance that is returned by +@code{allocate-instance}. The standard GOOPS methods perform +initializations appropriate to the instance class. + +@itemize @bullet +@item +At the least specialized level, the method for instances of type +@code{} performs internal GOOPS instance initialization, and +initializes the instance's slots according to the slot definitions and +any slot initialization keywords that appear in @var{initargs}. + +@item +The method for instances of type @code{} calls +@code{(next-method)}, then performs the class initializations described +in @ref{Customizing Class Definition}. + +@item +and so on for generic functions, method, operator classes @dots{} +@end itemize + +Similarly, you can customize the initialization of instances of any +application-defined class by defining an @code{initialize} method +specialized to that class. + +Imagine a class whose instances' slots need to be initialized at +instance creation time by querying a database. Although it might be +possible to achieve this a combination of @code{#:init-thunk} keywords +and closures in the slot definitions, it is neater to write an +@code{initialize} method for the class that queries the database once +and initializes all the dependent slot values according to the results. + +@node Accessing Slots +@section Accessing Slots + +The definition of a slot contains at the very least a slot name, and may +also contain various slot options, including getter, setter and/or +accessor functions for the slot. + +It is always possible to access slots by name, using the various +``slot-ref'' and ``slot-set!'' procedures described in the following +subsections. For example, + +@example +(define-class () ;; Define a class with slots + (count #:init-value 0) ;; named "count" and "cache". + (cache #:init-value '()) + @dots{}) + +(define inst (make )) ;; Make an instance of this class. + +(slot-set! inst 'count 5) ;; Set the value of the "count" + ;; slot to 5. + +(slot-set! inst 'cache ;; Modify the value of the + (cons (cons "^it" "It") ;; "cache" slot. + (slot-ref inst 'cache))) +@end example + +If a slot definition includes a getter, setter or accessor function, +these can be used instead of @code{slot-ref} and @code{slot-set!} to +access the slot. + +@example +(define-class () ;; Define a new class whose slots + (count #:setter set-count) ;; use a getter, a setter and + (cache #:accessor cache) ;; an accessor. + (csize #:getter cache-size) + @dots{}) + +(define inst (make )) ;; Make an instance of this class. + +(set-count inst 5) ;; Set the value of the "count" + ;; slot to 5. + +(set! (cache inst) ;; Modify the value of the + (cons (cons "^it" "It") ;; "cache" slot. + (cache inst))) + +(let ((size (cache-size inst))) ;; Get the value of the "csize" + @dots{}) ;; slot. +@end example + +Whichever of these methods is used to access slots, GOOPS always calls +the low-level @dfn{getter} and @dfn{setter} closures for the slot to get +and set its value. These closures make sure that the slot behaves +according to the @code{#:allocation} type that was specified in the slot +definition (@pxref{Slot Options,, allocation}). (For more about these +closures, see @ref{Customizing Class Definition,, compute-get-n-set}.) + +@menu +* Instance Slots:: +* Class Slots:: +* Handling Slot Access Errors:: +@end menu + +@node Instance Slots +@subsection Instance Slots + +Any slot, regardless of its allocation, can be queried, referenced and +set using the following four primitive procedures. + +@deffn {primitive procedure} slot-exists? obj slot-name +Return @code{#t} if @var{obj} has a slot with name @var{slot-name}, +otherwise @code{#f}. +@end deffn + +@deffn {primitive procedure} slot-bound? obj slot-name +Return @code{#t} if the slot named @var{slot-name} in @var{obj} has a +value, otherwise @code{#f}. + +@code{slot-bound?} calls the generic function @code{slot-missing} if +@var{obj} does not have a slot called @var{slot-name} (@pxref{Handling +Slot Access Errors, slot-missing}). +@end deffn + +@deffn {primitive procedure} slot-ref obj slot-name +Return the value of the slot named @var{slot-name} in @var{obj}. + +@code{slot-ref} calls the generic function @code{slot-missing} if +@var{obj} does not have a slot called @var{slot-name} (@pxref{Handling +Slot Access Errors, slot-missing}). + +@code{slot-ref} calls the generic function @code{slot-unbound} if the +named slot in @var{obj} does not have a value (@pxref{Handling Slot +Access Errors, slot-unbound}). +@end deffn + +@deffn {primitive procedure} slot-set! obj slot-name value +Set the value of the slot named @var{slot-name} in @var{obj} to @var{value}. + +@code{slot-set!} calls the generic function @code{slot-missing} if +@var{obj} does not have a slot called @var{slot-name} (@pxref{Handling +Slot Access Errors, slot-missing}). +@end deffn + +GOOPS stores information about slots in class metaobjects. Internally, +all of these procedures work by looking up the slot definition for the +slot named @var{slot-name} in the class metaobject for @code{(class-of +@var{obj})}, and then using the slot definition's ``getter'' and +``setter'' closures to get and set the slot value. + +The next four procedures differ from the previous ones in that they take +the class metaobject as an explicit argument, rather than assuming +@code{(class-of @var{obj})}. Therefore they allow you to apply the +``getter'' and ``setter'' closures of a slot definition in one class to +an instance of a different class. + +[ *fixme* I have no idea why this is useful! Perhaps when a slot in +@code{(class-of @var{obj})} shadows a slot with the same name in one of +its superclasses? There should be an enlightening example here. ] + +@deffn {primitive procedure} slot-exists-using-class? class obj slot-name +Return @code{#t} if the class metaobject @var{class} has a slot +definition for a slot with name @var{slot-name}, otherwise @code{#f}. +@end deffn + +@deffn {primitive procedure} slot-bound-using-class? class obj slot-name +Return @code{#t} if applying @code{slot-ref-using-class} to the same +arguments would call the generic function @code{slot-unbound}, otherwise +@code{#f}. + +@code{slot-bound-using-class?} calls the generic function +@code{slot-missing} if @var{class} does not have a slot definition for a +slot called @var{slot-name} (@pxref{Handling Slot Access Errors, +slot-missing}). +@end deffn + +@deffn {primitive procedure} slot-ref-using-class class obj slot-name +Apply the ``getter'' closure for the slot named @var{slot-name} in +@var{class} to @var{obj}, and return its result. + +@code{slot-ref-using-class} calls the generic function +@code{slot-missing} if @var{class} does not have a slot definition for a +slot called @var{slot-name} (@pxref{Handling Slot Access Errors, +slot-missing}). + +@code{slot-ref-using-class} calls the generic function +@code{slot-unbound} if the application of the ``getter'' closure to +@var{obj} returns an unbound value (@pxref{Handling Slot Access Errors, +slot-unbound}). +@end deffn + +@deffn {primitive procedure} slot-set-using-class! class obj slot-name value +Apply the ``setter'' closure for the slot named @var{slot-name} in +@var{class} to @var{obj} and @var{value}. + +@code{slot-set-using-class!} calls the generic function +@code{slot-missing} if @var{class} does not have a slot definition for a +slot called @var{slot-name} (@pxref{Handling Slot Access Errors, +slot-missing}). +@end deffn + +@node Class Slots +@subsection Class Slots + +Slots whose allocation is per-class rather than per-instance can be +referenced and set without needing to specify any particular instance. + +@deffn procedure class-slot-ref class slot-name +Return the value of the slot named @var{slot-name} in class @var{class}. +The named slot must have @code{#:class} or @code{#:each-subclass} +allocation (@pxref{Slot Options,, allocation}). + +If there is no such slot with @code{#:class} or @code{#:each-subclass} +allocation, @code{class-slot-ref} calls the @code{slot-missing} generic +function with arguments @var{class} and @var{slot-name}. Otherwise, if +the slot value is unbound, @code{class-slot-ref} calls the +@code{slot-missing} generic function, with the same arguments. +@end deffn + +@deffn procedure class-slot-set! class slot-name value +Set the value of the slot named @var{slot-name} in class @var{class} to +@var{value}. The named slot must have @code{#:class} or +@code{#:each-subclass} allocation (@pxref{Slot Options,, allocation}). + +If there is no such slot with @code{#:class} or @code{#:each-subclass} +allocation, @code{class-slot-ref} calls the @code{slot-missing} generic +function with arguments @var{class} and @var{slot-name}. +@end deffn + +@node Handling Slot Access Errors +@subsection Handling Slot Access Errors + +GOOPS calls one of the following generic functions when a ``slot-ref'' +or ``slot-set!'' call specifies a non-existent slot name, or tries to +reference a slot whose value is unbound. + +@deffn generic slot-missing +@deffnx method slot-missing (class ) slot-name +@deffnx method slot-missing (class ) (object ) slot-name +@deffnx method slot-missing (class ) (object ) slot-name value +When an application attempts to reference or set a class or instance +slot by name, and the slot name is invalid for the specified @var{class} +or @var{object}, GOOPS calls the @code{slot-missing} generic function. + +The default methods all call @code{goops-error} with an appropriate +message. +@end deffn + +@deffn generic slot-unbound +@deffnx method slot-unbound (object ) +@deffnx method slot-unbound (class ) slot-name +@deffnx method slot-unbound (class ) (object ) slot-name +When an application attempts to reference a class or instance slot, and +the slot's value is unbound, GOOPS calls the @code{slot-unbound} generic +function. + +The default methods all call @code{goops-error} with an appropriate +message. +@end deffn + +@node Creating Generic Functions +@section Creating Generic Functions + +A generic function is a collection of methods, with rules for +determining which of the methods should be applied for any given +invocation of the generic function. + +GOOPS represents generic functions as metaobjects of the class +@code{} (or one of its subclasses). + +@menu +* Basic Generic Function Creation:: +* Generic Function Internals:: +* Extending Guiles Primitives:: +@end menu + +@node Basic Generic Function Creation +@subsection Basic Generic Function Creation + +The following forms may be used to bind a variable to a generic +function. Depending on that variable's pre-existing value, the generic +function may be created empty - with no methods - or it may contain +methods that are inferred from the pre-existing value. + +It is not, in general, necessary to use @code{define-generic} or +@code{define-accessor} before defining methods for the generic function +using @code{define-method}, since @code{define-method} will +automatically interpolate a @code{define-generic} call, or upgrade an +existing generic to an accessor, if that is implied by the +@code{define-method} call. Note in particular that, +if the specified variable already has a @emph{generic function} value, +@code{define-generic} and @code{define-accessor} will @emph{discard} it! +Obviously it is application-dependent whether this is desirable or not. + +If, for example, you wanted to extend @code{+} for a class representing +a new numerical type, you probably want to inherit any existing methods +for @code{+} and so should not use @code{define-generic}. If, on the +other hand, you do not want to risk inheriting methods whose behaviour +might surprise you, you can use @code{define-generic} or +@code{define-accessor} to wipe the slate clean. + +@deffn syntax define-generic symbol +Create a generic function with name @var{symbol} and bind it to the +variable @var{symbol}. + +If the variable @var{symbol} was previously bound to a Scheme procedure +(or procedure-with-setter), the old procedure (and setter) is +incorporated into the new generic function as its default procedure (and +setter). Any other previous value that was bound to @var{symbol}, +including an existing generic function, is overwritten by the new +generic function. +@end deffn + +@deffn syntax define-accessor symbol +Create an accessor with name @var{symbol} and bind it to the variable +@var{symbol}. + +If the variable @var{symbol} was previously bound to a Scheme procedure +(or procedure-with-setter), the old procedure (and setter) is +incorporated into the new accessor as its default procedure (and +setter). Any other previous value that was bound to @var{symbol}, +including an existing generic function or accessor, is overwritten by +the new definition. +@end deffn + +It is sometimes tempting to use GOOPS accessors with short names. For +example, it is tempting to use the name @code{x} for the x-coordinate +in vector packages. + +Assume that we work with a graphical package which needs to use two +independent vector packages for 2D and 3D vectors respectively. If +both packages export @code{x} we will encounter a name collision. + +This can be resolved automagically with the duplicates handler +@code{merge-generics} which gives the module system license to merge +all generic functions sharing a common name: + +@smalllisp +(define-module (math 2D-vectors) + :use-module (oop goops) + :export (x y ...)) + +(define-module (math 3D-vectors) + :use-module (oop goops) + :export (x y z ...)) + +(define-module (my-module) + :use-module (math 2D-vectors) + :use-module (math 3D-vectors) + :duplicates merge-generics) +@end smalllisp + +The generic function @code{x} in @code{(my-module)} will now share +methods with @code{x} in both imported modules. + +There will, in fact, now be three distinct generic functions named +@code{x}: @code{x} in @code{(2D-vectors)}, @code{x} in +@code{(3D-vectors)}, and @code{x} in @code{(my-module)}. The last +function will be an @code{}, extending the previous +two functions. + +Let's call the imported generic functions the "ancestor functions". +The generic function @code{x} in @code{(my-module)} is, in turn, a +"descendant function" of the imported functions, extending its +ancestors. + +For any generic function G, the applicable methods are selected from +the union of the methods of the descendant functions, the methods of G +itself and the methods of the ancestor functions. + +This, ancestor functions share methods with their descendants and vice +versa. This implies that @code{x} in @code{(math 2D-vectors)} will +share the methods of @code{x} in @code{(my-module)} and vice versa, +while @code{x} in @code{(math 2D-vectors)} doesn't share the methods +of @code{x} in @code{(math 3D-vectors)}, thus preserving modularity. + +Sharing is dynamic, so that adding new methods to a descendant implies +adding it to the ancestor. + +If duplicates checking is desired in the above example, the following +form of the @code{:duplicates} option can be used instead: + +@smalllisp + :duplicates (merge-generics check) +@end smalllisp + +@node Generic Function Internals +@subsection Generic Function Internals + +@code{define-generic} calls @code{ensure-generic} to upgrade a +pre-existing procedure value, or @code{make} with metaclass +@code{} to create a new generic function. + +@code{define-accessor} calls @code{ensure-accessor} to upgrade a +pre-existing procedure value, or @code{make-accessor} to create a new +accessor. + +@deffn procedure ensure-generic old-definition [name] +Return a generic function with name @var{name}, if possible by using or +upgrading @var{old-definition}. If unspecified, @var{name} defaults to +@code{#f}. + +If @var{old-definition} is already a generic function, it is returned +unchanged. + +If @var{old-definition} is a Scheme procedure or procedure-with-setter, +@code{ensure-generic} returns a new generic function that uses +@var{old-definition} for its default procedure and setter. + +Otherwise @code{ensure-generic} returns a new generic function with no +defaults and no methods. +@end deffn + +@deffn procedure make-generic [name] +Return a new generic function with name @code{(car @var{name})}. If +unspecified, @var{name} defaults to @code{#f}. +@end deffn + +@code{ensure-generic} calls @code{make} with metaclasses +@code{} and @code{}, depending on the +previous value of the variable that it is trying to upgrade. + +@code{make-generic} is a simple wrapper for @code{make} with metaclass +@code{}. + +@deffn procedure ensure-accessor proc [name] +Return an accessor with name @var{name}, if possible by using or +upgrading @var{proc}. If unspecified, @var{name} defaults to @code{#f}. + +If @var{proc} is already an accessor, it is returned unchanged. + +If @var{proc} is a Scheme procedure, procedure-with-setter or generic +function, @code{ensure-accessor} returns an accessor that reuses the +reusable elements of @var{proc}. + +Otherwise @code{ensure-accessor} returns a new accessor with no defaults +and no methods. +@end deffn + +@deffn procedure make-accessor [name] +Return a new accessor with name @code{(car @var{name})}. If +unspecified, @var{name} defaults to @code{#f}. +@end deffn + +@code{ensure-accessor} calls @code{make} with +metaclass @code{}, as well as calls to +@code{ensure-generic}, @code{make-accessor} and (tail recursively) +@code{ensure-accessor}. + +@code{make-accessor} calls @code{make} twice, first +with metaclass @code{} to create a generic function for the +setter, then with metaclass @code{} to create the +accessor, passing the setter generic function as the value of the +@code{#:setter} keyword. + +@node Extending Guiles Primitives +@subsection Extending Guile's Primitives + +When GOOPS is loaded, many of Guile's primitive procedures can be +extended by giving them a generic function definition that operates +in conjunction with their normal C-coded implementation. For +primitives that are extended in this way, the result from the user- +or application-level point of view is that the extended primitive +behaves exactly like a generic function with the C-coded implementation +as its default method. + +The @code{generic-capability?} predicate should be used to determine +whether a particular primitive is extensible in this way. + +@deffn {primitive procedure} generic-capability? primitive +Return @code{#t} if @var{primitive} can be extended by giving it a +generic function definition, otherwise @code{#f}. +@end deffn + +Even when a primitive procedure is extensible like this, its generic +function definition is not created until it is needed by a call to +@code{define-method}, or until the application explicitly requests it +by calling @code{enable-primitive-generic!}. + +@deffn {primitive procedure} enable-primitive-generic! primitive +Force the creation of a generic function definition for +@var{primitive}. +@end deffn + +Once the generic function definition for a primitive has been created, +it can be retrieved using @code{primitive-generic-generic}. + +@deffn {primitive procedure} primitive-generic-generic primitive +Return the generic function definition of @var{primitive}. + +@code{primitive-generic-generic} raises an error if @var{primitive} +is not a primitive with generic capability, or if its generic capability +has not yet been enabled, whether implicitly (by @code{define-method}) +or explicitly (by @code{enable-primitive-generic!}). +@end deffn + +Note that the distinction between, on the one hand, primitives with +additional generic function definitions and, on the other hand, generic +functions with a default method, may disappear when GOOPS is fully +integrated into the core of Guile. Consequently, the +procedures described in this section may disappear as well. + +@node Adding Methods to Generic Functions +@section Adding Methods to Generic Functions + +@menu +* Basic Method Definition:: +* Method Definition Internals:: +@end menu + +@node Basic Method Definition +@subsection Basic Method Definition + +To add a method to a generic function, use the @code{define-method} form. + +@deffn syntax define-method (generic parameter @dots{}) . body +Define a method for the generic function or accessor @var{generic} with +parameters @var{parameter}s and body @var{body}. + +@var{generic} is a generic function. If @var{generic} is a variable +which is not yet bound to a generic function object, the expansion of +@code{define-method} will include a call to @code{define-generic}. If +@var{generic} is @code{(setter @var{generic-with-setter})}, where +@var{generic-with-setter} is a variable which is not yet bound to a +generic-with-setter object, the expansion will include a call to +@code{define-accessor}. + +Each @var{parameter} must be either a symbol or a two-element list +@code{(@var{symbol} @var{class})}. The symbols refer to variables in +the @var{body} that will be bound to the parameters supplied by the +caller when calling this method. The @var{class}es, if present, +specify the possible combinations of parameters to which this method +can be applied. + +@var{body} is the body of the method definition. +@end deffn + +@code{define-method} expressions look a little like normal Scheme +procedure definitions of the form + +@example +(define (name formals @dots{}) . body) +@end example + +The most important difference is that each formal parameter, apart from the +possible ``rest'' argument, can be qualified by a class name: +@code{@var{formal}} becomes @code{(@var{formal} @var{class})}. The +meaning of this qualification is that the method being defined +will only be applicable in a particular generic function invocation if +the corresponding argument is an instance of @code{@var{class}} (or one of +its subclasses). If more than one of the formal parameters is qualified +in this way, then the method will only be applicable if each of the +corresponding arguments is an instance of its respective qualifying class. + +Note that unqualified formal parameters act as though they are qualified +by the class @code{}, which GOOPS uses to mean the superclass of +all valid Scheme types, including both primitive types and GOOPS classes. + +For example, if a generic function method is defined with +@var{parameter}s @code{((s1 ) (n ))}, that method is +only applicable to invocations of its generic function that have two +parameters where the first parameter is an instance of the +@code{} class and the second parameter is a number. + +If a generic function is invoked with a combination of parameters for which +there is no applicable method, GOOPS raises an error. For more about +invocation error handling, and generic function invocation in general, +see @ref{Invoking Generic Functions}. + +@node Method Definition Internals +@subsection Method Definition Internals + +@code{define-method} + +@itemize @bullet +@item +checks the form of the first parameter, and applies the following steps +to the accessor's setter if it has the @code{(setter @dots{})} form + +@item +interpolates a call to @code{define-generic} or @code{define-accessor} +if a generic function is not already defined with the supplied name + +@item +calls @code{method} with the @var{parameter}s and @var{body}, to make a +new method instance + +@item +calls @code{add-method!} to add this method to the relevant generic +function. +@end itemize + +@deffn syntax method (parameter @dots{}) . body +Make a method whose specializers are defined by the classes in +@var{parameter}s and whose procedure definition is constructed from the +@var{parameter} symbols and @var{body} forms. + +The @var{parameter} and @var{body} parameters should be as for +@code{define-method} (@pxref{Basic Method Definition,, define-method}). +@end deffn + +@code{method} + +@itemize @bullet +@item +extracts formals and specializing classes from the @var{parameter}s, +defaulting the class for unspecialized parameters to @code{} + +@item +creates a closure using the formals and the @var{body} forms + +@item +calls @code{make} with metaclass @code{} and the specializers +and closure using the @code{#:specializers} and @code{#:procedure} +keywords. +@end itemize + +@deffn procedure make-method specializers procedure +Make a method using @var{specializers} and @var{procedure}. + +@var{specializers} should be a list of classes that specifies the +parameter combinations to which this method will be applicable. + +@var{procedure} should be the closure that will applied to the generic +function parameters when this method is invoked. +@end deffn + +@code{make-method} is a simple wrapper around @code{make} with metaclass +@code{}. + +@deffn generic add-method! target method +Generic function for adding method @var{method} to @var{target}. +@end deffn + +@deffn method add-method! (generic ) (method ) +Add method @var{method} to the generic function @var{generic}. +@end deffn + +@deffn method add-method! (proc ) (method ) +If @var{proc} is a procedure with generic capability (@pxref{Extending +Guiles Primitives,, generic-capability?}), upgrade it to a +primitive generic and add @var{method} to its generic function +definition. +@end deffn + +@deffn method add-method! (pg ) (method ) +Add method @var{method} to the generic function definition of @var{pg}. + +Implementation: @code{(add-method! (primitive-generic-generic pg) method)}. +@end deffn + +@deffn method add-method! (whatever ) (method ) +Raise an error indicating that @var{whatever} is not a valid generic +function. +@end deffn + +@node Invoking Generic Functions +@section Invoking Generic Functions + +When a variable with a generic function definition appears as the first +element of a list that is being evaluated, the Guile evaluator tries +to apply the generic function to the arguments obtained by evaluating +the remaining elements of the list. [ *fixme* How do I put this in a +more Schemely and less Lispy way? ] + +Usually a generic function contains several method definitions, with +varying degrees of formal parameter specialization (@pxref{Basic +Method Definition,, define-method}). So it is necessary to sort these +methods by specificity with respect to the supplied arguments, and then +apply the most specific method definition. Less specific methods +may be applied subsequently if a method that is being applied calls +@code{next-method}. + +@menu +* Determining Which Methods to Apply:: +* Handling Invocation Errors:: +@end menu + +@node Determining Which Methods to Apply +@subsection Determining Which Methods to Apply + +[ *fixme* Sorry - this is the area of GOOPS that I understand least of +all, so I'm afraid I have to pass on this section. Would some other +kind person consider filling it in? ] + +@deffn generic apply-generic +@deffnx method apply-generic (gf ) args +@end deffn + +@deffn generic compute-applicable-methods +@deffnx method compute-applicable-methods (gf ) args +@end deffn + +@deffn generic sort-applicable-methods +@deffnx method sort-applicable-methods (gf ) methods args +@end deffn + +@deffn generic method-more-specific? +@deffnx method method-more-specific? (m1 ) (m2 ) args +@end deffn + +@deffn generic apply-method +@deffnx method apply-method (gf ) methods build-next args +@end deffn + +@deffn generic apply-methods +@deffnx method apply-methods (gf ) (l ) args +@end deffn + +@node Handling Invocation Errors +@subsection Handling Invocation Errors + +@deffn generic no-method +@deffnx method no-method (gf ) args +When an application invokes a generic function, and no methods at all +have been defined for that generic function, GOOPS calls the +@code{no-method} generic function. The default method calls +@code{goops-error} with an appropriate message. +@end deffn + +@deffn generic no-applicable-method +@deffnx method no-applicable-method (gf ) args +When an application applies a generic function to a set of arguments, +and no methods have been defined for those argument types, GOOPS calls +the @code{no-applicable-method} generic function. The default method +calls @code{goops-error} with an appropriate message. +@end deffn + +@deffn generic no-next-method +@deffnx method no-next-method (gf ) args +When a generic function method calls @code{(next-method)} to invoke the +next less specialized method for that generic function, and no less +specialized methods have been defined for the current generic function +arguments, GOOPS calls the @code{no-next-method} generic function. The +default method calls @code{goops-error} with an appropriate message. +@end deffn + +@node Redefining a Class +@section Redefining a Class + +Suppose that a class @code{} is defined using @code{define-class} +(@pxref{Basic Class Definition,, define-class}), with slots that have +accessor functions, and that an application has created several instances +of @code{} using @code{make} (@pxref{Basic Instance Creation,, +make}). What then happens if @code{} is redefined by calling +@code{define-class} again? + +@menu +* Default Class Redefinition Behaviour:: +* Customizing Class Redefinition:: +@end menu + +@node Default Class Redefinition Behaviour +@subsection Default Class Redefinition Behaviour + +GOOPS' default answer to this question is as follows. + +@itemize @bullet +@item +All existing direct instances of @code{} are converted to be +instances of the new class. This is achieved by preserving the values +of slots that exist in both the old and new definitions, and initializing the +values of new slots in the usual way (@pxref{Basic Instance Creation,, +make}). + +@item +All existing subclasses of @code{} are redefined, as though +the @code{define-class} expressions that defined them were re-evaluated +following the redefinition of @code{}, and the class +redefinition process described here is applied recursively to the +redefined subclasses. + +@item +Once all of its instances and subclasses have been updated, the class +metaobject previously bound to the variable @code{} is no +longer needed and so can be allowed to be garbage collected. +@end itemize + +To keep things tidy, GOOPS also needs to do a little housekeeping on +methods that are associated with the redefined class. + +@itemize @bullet +@item +Slot accessor methods for slots in the old definition should be removed +from their generic functions. They will be replaced by accessor methods +for the slots of the new class definition. + +@item +Any generic function method that uses the old @code{} metaobject +as one of its formal parameter specializers must be updated to refer to +the new @code{} metaobject. (Whenever a new generic function +method is defined, @code{define-method} adds the method to a list stored +in the class metaobject for each class used as a formal parameter +specializer, so it is easy to identify all the methods that must be +updated when a class is redefined.) +@end itemize + +If this class redefinition strategy strikes you as rather counter-intuitive, +bear in mind that it is derived from similar behaviour in other object +systems such as CLOS, and that experience in those systems has shown it to be +very useful in practice. + +Also bear in mind that, like most of GOOPS' default behaviour, it can +be customized@dots{} + +@node Customizing Class Redefinition +@subsection Customizing Class Redefinition + +When @code{define-class} notices that a class is being redefined, +it constructs the new class metaobject as usual, and then invokes the +@code{class-redefinition} generic function with the old and new classes +as arguments. Therefore, if the old or new classes have metaclasses +other than the default @code{}, class redefinition behaviour can +be customized by defining a @code{class-redefinition} method that is +specialized for the relevant metaclasses. + +@deffn generic class-redefinition +Handle the class redefinition from @var{old-class} to @var{new-class}, +and return the new class metaobject that should be bound to the +variable specified by @code{define-class}'s first argument. +@end deffn + +@deffn method class-redefinition (old-class ) (new-class ) +Implements GOOPS' default class redefinition behaviour, as described in +@ref{Default Class Redefinition Behaviour}. Returns the metaobject +for the new class definition. +@end deffn + +An alternative class redefinition strategy could be to leave all +existing instances as instances of the old class, but accepting that the +old class is now ``nameless'', since its name has been taken over by the +new definition. In this strategy, any existing subclasses could also +be left as they are, on the understanding that they inherit from a nameless +superclass. + +This strategy is easily implemented in GOOPS, by defining a new metaclass, +that will be used as the metaclass for all classes to which the strategy +should apply, and then defining a @code{class-redefinition} method that +is specialized for this metaclass: + +@example +(define-class ()) + +(define-method (class-redefinition (old ) (new )) + new) +@end example + +When customization can be as easy as this, aren't you glad that GOOPS +implements the far more difficult strategy as its default! + +Finally, note that, if @code{class-redefinition} itself is not customized, +the default @code{class-redefinition} method invokes three further +generic functions that could be individually customized: + +@itemize @bullet +@item +(remove-class-accessors! @var{old-class}) + +@item +(update-direct-method! @var{method} @var{old-class} @var{new-class}) + +@item +(update-direct-subclass! @var{subclass} @var{old-class} @var{new-class}) +@end itemize + +and the default methods for these generic functions invoke further +generic functions, and so on@dots{} The detailed protocol for all of these +is described in @ref{MOP Specification}. + +@node Changing the Class of an Instance +@section Changing the Class of an Instance + +You can change the class of an existing instance by invoking the +generic function @code{change-class} with two arguments: the instance +and the new class. + +@deffn generic change-class +@end deffn + +The default method for @code{change-class} decides how to implement the +change of class by looking at the slot definitions for the instance's +existing class and for the new class. If the new class has slots with +the same name as slots in the existing class, the values for those slots +are preserved. Slots that are present only in the existing class are +discarded. Slots that are present only in the new class are initialized +using the corresponding slot definition's init function (@pxref{Classes,, +slot-init-function}). + +@deffn {method} change-class (obj ) (new ) +Modify instance @var{obj} to make it an instance of class @var{new}. + +The value of each of @var{obj}'s slots is preserved only if a similarly named +slot exists in @var{new}; any other slot values are discarded. + +The slots in @var{new} that do not correspond to any of @var{obj}'s +pre-existing slots are initialized according to @var{new}'s slot definitions' +init functions. +@end deffn + +Customized change of class behaviour can be implemented by defining +@code{change-class} methods that are specialized either by the class +of the instances to be modified or by the metaclass of the new class. + +When a class is redefined (@pxref{Redefining a Class}), and the default +class redefinition behaviour is not overridden, GOOPS (eventually) +invokes the @code{change-class} generic function for each existing +instance of the redefined class. + +@node Introspection +@section Introspection + +@dfn{Introspection}, also known as @dfn{reflection}, is the name given +to the ability to obtain information dynamically about GOOPS metaobjects. +It is perhaps best illustrated by considering an object oriented language +that does not provide any introspection, namely C++. + +Nothing in C++ allows a running program to obtain answers to the following +types of question: + +@itemize @bullet +@item +What are the data members of this object or class? + +@item +What classes does this class inherit from? + +@item +Is this method call virtual or non-virtual? + +@item +If I invoke @code{Employee::adjustHoliday()}, what class contains the +@code{adjustHoliday()} method that will be applied? +@end itemize + +In C++, answers to such questions can only be determined by looking at +the source code, if you have access to it. GOOPS, on the other hand, +includes procedures that allow answers to these questions --- or their +GOOPS equivalents --- to be obtained dynamically, at run time. + +@menu +* Classes:: +* Slots:: +* Instances:: +* Generic Functions:: +* Generic Function Methods:: +@end menu + +@node Classes +@subsection Classes + +@deffn {primitive procedure} class-name class +Return the name of class @var{class}. +This is the value of the @var{class} metaobject's @code{name} slot. +@end deffn + +@deffn {primitive procedure} class-direct-supers class +Return a list containing the direct superclasses of @var{class}. +This is the value of the @var{class} metaobject's +@code{direct-supers} slot. +@end deffn + +@deffn {primitive procedure} class-direct-slots class +Return a list containing the slot definitions of the direct slots of +@var{class}. +This is the value of the @var{class} metaobject's @code{direct-slots} +slot. +@end deffn + +@deffn {primitive procedure} class-direct-subclasses class +Return a list containing the direct subclasses of @var{class}. +This is the value of the @var{class} metaobject's +@code{direct-subclasses} slot. +@end deffn + +@deffn {primitive procedure} class-direct-methods class +Return a list of all the generic function methods that use @var{class} +as a formal parameter specializer. +This is the value of the @var{class} metaobject's @code{direct-methods} +slot. +@end deffn + +@deffn {primitive procedure} class-precedence-list class +Return the class precedence list for class @var{class} (@pxref{Class +precedence list}). +This is the value of the @var{class} metaobject's @code{cpl} slot. +@end deffn + +@deffn {primitive procedure} class-slots class +Return a list containing the slot definitions for all @var{class}'s slots, +including any slots that are inherited from superclasses. +This is the value of the @var{class} metaobject's @code{slots} slot. +@end deffn + +@deffn {primitive procedure} class-environment class +Return the value of @var{class}'s @code{environment} slot. +[ *fixme* I don't know what this value is used for. ] +@end deffn + +@deffn procedure class-subclasses class +Return a list of all subclasses of @var{class}. +@end deffn + +@deffn procedure class-methods class +Return a list of all methods that use @var{class} or a subclass of +@var{class} as one of its formal parameter specializers. +@end deffn + +@node Slots +@subsection Slots + +@deffn procedure class-slot-definition class slot-name +Return the slot definition for the slot named @var{slot-name} in class +@var{class}. @var{slot-name} should be a symbol. +@end deffn + +@deffn procedure slot-definition-name slot-def +Extract and return the slot name from @var{slot-def}. +@end deffn + +@deffn procedure slot-definition-options slot-def +Extract and return the slot options from @var{slot-def}. +@end deffn + +@deffn procedure slot-definition-allocation slot-def +Extract and return the slot allocation option from @var{slot-def}. This +is the value of the @code{#:allocation} keyword (@pxref{Slot Options,, +allocation}), or @code{#:instance} if the @code{#:allocation} keyword is +absent. +@end deffn + +@deffn procedure slot-definition-getter slot-def +Extract and return the slot getter option from @var{slot-def}. This is +the value of the @code{#:getter} keyword (@pxref{Slot Options,, +getter}), or @code{#f} if the @code{#:getter} keyword is absent. +@end deffn + +@deffn procedure slot-definition-setter slot-def +Extract and return the slot setter option from @var{slot-def}. This is +the value of the @code{#:setter} keyword (@pxref{Slot Options,, +setter}), or @code{#f} if the @code{#:setter} keyword is absent. +@end deffn + +@deffn procedure slot-definition-accessor slot-def +Extract and return the slot accessor option from @var{slot-def}. This +is the value of the @code{#:accessor} keyword (@pxref{Slot Options,, +accessor}), or @code{#f} if the @code{#:accessor} keyword is absent. +@end deffn + +@deffn procedure slot-definition-init-value slot-def +Extract and return the slot init-value option from @var{slot-def}. This +is the value of the @code{#:init-value} keyword (@pxref{Slot Options,, +init-value}), or the unbound value if the @code{#:init-value} keyword is +absent. +@end deffn + +@deffn procedure slot-definition-init-form slot-def +Extract and return the slot init-form option from @var{slot-def}. This +is the value of the @code{#:init-form} keyword (@pxref{Slot Options,, +init-form}), or the unbound value if the @code{#:init-form} keyword is +absent. +@end deffn + +@deffn procedure slot-definition-init-thunk slot-def +Extract and return the slot init-thunk option from @var{slot-def}. This +is the value of the @code{#:init-thunk} keyword (@pxref{Slot Options,, +init-thunk}), or @code{#f} if the @code{#:init-thunk} keyword is absent. +@end deffn + +@deffn procedure slot-definition-init-keyword slot-def +Extract and return the slot init-keyword option from @var{slot-def}. +This is the value of the @code{#:init-keyword} keyword (@pxref{Slot +Options,, init-keyword}), or @code{#f} if the @code{#:init-keyword} +keyword is absent. +@end deffn + +@deffn procedure slot-init-function class slot-name +Return the initialization function for the slot named @var{slot-name} in +class @var{class}. @var{slot-name} should be a symbol. + +The returned initialization function incorporates the effects of the +standard @code{#:init-thunk}, @code{#:init-form} and @code{#:init-value} +slot options. These initializations can be overridden by the +@code{#:init-keyword} slot option or by a specialized @code{initialize} +method, so, in general, the function returned by +@code{slot-init-function} may be irrelevant. For a fuller discussion, +see @ref{Slot Options,, init-value}. +@end deffn + +@node Instances +@subsection Instances + +@deffn {primitive procedure} class-of value +Return the GOOPS class of any Scheme @var{value}. +@end deffn + +@deffn {primitive procedure} instance? object +Return @code{#t} if @var{object} is any GOOPS instance, otherwise +@code{#f}. +@end deffn + +@deffn procedure is-a? object class +Return @code{#t} if @var{object} is an instance of @var{class} or one of +its subclasses. +@end deffn + +Implementation notes: @code{is-a?} uses @code{class-of} and +@code{class-precedence-list} to obtain the class precedence list for +@var{object}. + +@node Generic Functions +@subsection Generic Functions + +@deffn {primitive procedure} generic-function-name gf +Return the name of generic function @var{gf}. +@end deffn + +@deffn {primitive procedure} generic-function-methods gf +Return a list of the methods of generic function @var{gf}. +This is the value of the @var{gf} metaobject's @code{methods} slot. +@end deffn + +@node Generic Function Methods +@subsection Generic Function Methods + +@deffn {primitive procedure} method-generic-function method +Return the generic function that @var{method} belongs to. +This is the value of the @var{method} metaobject's +@code{generic-function} slot. +@end deffn + +@deffn {primitive procedure} method-specializers method +Return a list of @var{method}'s formal parameter specializers . +This is the value of the @var{method} metaobject's +@code{specializers} slot. +@end deffn + +@deffn {primitive procedure} method-procedure method +Return the procedure that implements @var{method}. +This is the value of the @var{method} metaobject's +@code{procedure} slot. +@end deffn + +@deffn generic method-source +@deffnx method method-source (m ) +Return an expression that prints to show the definition of method +@var{m}. + +@example +(define-generic cube) + +(define-method (cube (n )) + (* n n n)) + +(map method-source (generic-function-methods cube)) +@result{} +((method ((n )) (* n n n))) +@end example +@end deffn + +@node Miscellaneous Functions +@section Miscellaneous Functions + +@menu +* Administrative Functions:: +* Error Handling:: +* Object Comparisons:: +* Cloning Objects:: +* Write and Display:: +@end menu + +@node Administrative Functions +@subsection Administration Functions + +This section describes administrative, non-technical GOOPS functions. + +@deffn primitive goops-version +Return the current GOOPS version as a string, for example ``0.2''. +@end deffn + +@node Error Handling +@subsection Error Handling + +The procedure @code{goops-error} is called to raise an appropriate error +by the default methods of the following generic functions: + +@itemize @bullet +@item +@code{slot-missing} (@pxref{Handling Slot Access Errors,, slot-missing}) + +@item +@code{slot-unbound} (@pxref{Handling Slot Access Errors,, slot-unbound}) + +@item +@code{no-method} (@pxref{Handling Invocation Errors,, no-method}) + +@item +@code{no-applicable-method} (@pxref{Handling Invocation Errors,, +no-applicable-method}) + +@item +@code{no-next-method} (@pxref{Handling Invocation Errors,, +no-next-method}) +@end itemize + +If you customize these functions for particular classes or metaclasses, +you may still want to use @code{goops-error} to signal any error +conditions that you detect. + +@deffn procedure goops-error format-string . args +Raise an error with key @code{goops-error} and error message constructed +from @var{format-string} and @var{args}. Error message formatting is +as done by @code{scm-error}. +@end deffn + +@node Object Comparisons +@subsection Object Comparisons + +@deffn generic eqv? +@deffnx method eqv? ((x ) (y )) +@deffnx generic equal? +@deffnx method equal? ((x ) (y )) +@deffnx generic = +@deffnx method = ((x ) (y )) +Generic functions and default (unspecialized) methods for comparing two +GOOPS objects. + +The default method for @code{eqv?} returns @code{#t} for all values +that are equal in the sense defined by R5RS and the Guile reference +manual, otherwise @code{#f}. The default method for @code{equal?} +returns @code{#t} or @code{#f} in the sense defined by R5RS and the +Guile reference manual. If no such comparison is defined, +@code{equal?} returns the result of a call to @code{eqv?}. The +default method for = returns @code{#t} if @var{x} and @var{y} are +numerically equal, otherwise @code{#f}. + +Application class authors may wish to define specialized methods for +@code{eqv?}, @code{equal?} and @code{=} that compare instances of the +same class for equality in whatever sense is useful to the +application. Such methods will only be called if the arguments have +the same class and the result of the comparison isn't defined by R5RS +and the Guile reference manual. +@end deffn + +@node Cloning Objects +@subsection Cloning Objects + +@deffn generic shallow-clone +@deffnx method shallow-clone (self ) +Return a ``shallow'' clone of @var{self}. The default method makes a +shallow clone by allocating a new instance and copying slot values from +self to the new instance. Each slot value is copied either as an +immediate value or by reference. +@end deffn + +@deffn generic deep-clone +@deffnx method deep-clone (self ) +Return a ``deep'' clone of @var{self}. The default method makes a deep +clone by allocating a new instance and copying or cloning slot values +from self to the new instance. If a slot value is an instance +(satisfies @code{instance?}), it is cloned by calling @code{deep-clone} +on that value. Other slot values are copied either as immediate values +or by reference. +@end deffn + +@node Write and Display +@subsection Write and Display + +@deffn {primitive generic} write object port +@deffnx {primitive generic} display object port +When GOOPS is loaded, @code{write} and @code{display} become generic +functions with special methods for printing + +@itemize @bullet +@item +objects - instances of the class @code{} + +@item +foreign objects - instances of the class @code{} + +@item +classes - instances of the class @code{} + +@item +generic functions - instances of the class @code{} + +@item +methods - instances of the class @code{}. +@end itemize + +@code{write} and @code{display} print non-GOOPS values in the same way +as the Guile primitive @code{write} and @code{display} functions. +@end deffn + +@node MOP Specification, Tutorial, Reference Manual, Top +@chapter MOP Specification + +For an introduction to metaobjects and the metaobject protocol, +see @ref{Metaobjects and the Metaobject Protocol}. + +The aim of the MOP specification in this chapter is to specify all the +customizable generic function invocations that can be made by the standard +GOOPS syntax, procedures and methods, and to explain the protocol for +customizing such invocations. + +A generic function invocation is customizable if the types of the arguments +to which it is applied are not all determined by the lexical context in +which the invocation appears. For example, + +@itemize @bullet +@item +the @code{(initialize @var{instance} @var{initargs})} invocation in the +default @code{make-instance} method is customizable, because the type of the +@code{@var{instance}} argument is determined by the class that was passed to +@code{make-instance}. + +@item +the @code{(make #:name ',name)} invocation in @code{define-generic} +is not customizable, because all of its arguments have lexically determined +types. +@end itemize + +When using this rule to decide whether a given generic function invocation +is customizable, we ignore arguments that are expected to be handled in +method definitions as a single ``rest'' list argument. + +For each customizable generic function invocation, the @dfn{invocation +protocol} is explained by specifying + +@itemize @bullet +@item +what, conceptually, the applied method is intended to do + +@item +what assumptions, if any, the caller makes about the applied method's side +effects + +@item +what the caller expects to get as the applied method's return value. +@end itemize + +@menu +* Class Definition:: +* Instance Creation:: +* Class Redefinition:: +* Method Definition:: +* Generic Function Invocation:: +@end menu + +@node Class Definition +@section Class Definition + +@code{define-class} (syntax) + +@itemize @bullet +@item +@code{class} (syntax) + +@itemize @bullet +@item +@code{make-class} (procedure) + +@itemize @bullet +@item +@code{make @var{metaclass} @dots{}} (generic) + +@var{metaclass} is the metaclass of the class being defined, either +taken from the @code{#:metaclass} class option or computed by +@code{ensure-metaclass}. The applied method must create and return the +fully initialized class metaobject for the new class definition. +@end itemize + +@end itemize + +@item +@code{class-redefinition @var{old-class} @var{new-class}} (generic) + +@code{define-class} calls @code{class-redefinition} if the variable +specified by its first argument already held a GOOPS class definition. +@var{old-class} and @var{new-class} are the old and new class metaobjects. +The applied method should perform whatever is necessary to handle the +redefinition, and should return the class metaobject that is to be bound +to @code{define-class}'s variable. The default class redefinition +protocol is described in @ref{Class Redefinition}. +@end itemize + +The @code{(make @var{metaclass} @dots{})} invocation above will create +an class metaobject with metaclass @var{metaclass}. By default, this +metaobject will be initialized by the @code{initialize} method that is +specialized for instances of type @code{}. + +@code{initialize @var{initargs}} (method) + +@itemize @bullet +@item +@code{compute-cpl @var{class}} (generic) + +The applied method should compute and return the class precedence list +for @var{class} as a list of class metaobjects. When @code{compute-cpl} +is called, the following @var{class} metaobject slots have all been +initialized: @code{name}, @code{direct-supers}, @code{direct-slots}, +@code{direct-subclasses} (empty), @code{direct-methods}. The value +returned by @code{compute-cpl} will be stored in the @code{cpl} slot. + +@item +@code{compute-slots @var{class}} (generic) + +The applied method should compute and return the slots (union of direct +and inherited) for @var{class} as a list of slot definitions. When +@code{compute-slots} is called, all the @var{class} metaobject slots +mentioned for @code{compute-cpl} have been initialized, plus the +following: @code{cpl}, @code{redefined} (@code{#f}), @code{environment}. +The value returned by @code{compute-slots} will be stored in the +@code{slots} slot. + +@item +@code{compute-get-n-set @var{class} @var{slot-def}} (generic) + +@code{initialize} calls @code{compute-get-n-set} for each slot computed +by @code{compute-slots}. The applied method should compute and return a +pair of closures that, respectively, get and set the value of the specified +slot. The get closure should have arity 1 and expect a single argument +that is the instance whose slot value is to be retrieved. The set closure +should have arity 2 and expect two arguments, where the first argument is +the instance whose slot value is to be set and the second argument is the +new value for that slot. The closures should be returned in a two element +list: @code{(list @var{get} @var{set})}. + +The closures returned by @code{compute-get-n-set} are stored as part of +the value of the @var{class} metaobject's @code{getters-n-setters} slot. +Specifically, the value of this slot is a list with the same number of +elements as there are slots in the class, and each element looks either like + +@example +@code{(@var{slot-name-symbol} @var{init-function} . @var{index})} +@end example + +or like + +@example +@code{(@var{slot-name-symbol} @var{init-function} @var{get} @var{set})} +@end example + +Where the get and set closures are replaced by @var{index}, the slot is +an instance slot and @var{index} is the slot's index in the underlying +structure: GOOPS knows how to get and set the value of such slots and so +does not need specially constructed get and set closures. Otherwise, +@var{get} and @var{set} are the closures returned by @code{compute-get-n-set}. + +The structure of the @code{getters-n-setters} slot value is important when +understanding the next customizable generic functions that @code{initialize} +calls@dots{} + +@item +@code{compute-getter-method @var{class} @var{gns}} (generic) + +@code{initialize} calls @code{compute-getter-method} for each of the class's +slots (as determined by @code{compute-slots}) that includes a +@code{#:getter} or @code{#:accessor} slot option. @var{gns} is the +element of the @var{class} metaobject's @code{getters-n-setters} slot that +specifies how the slot in question is referenced and set, as described +above under @code{compute-get-n-set}. The applied method should create +and return a method that is specialized for instances of type @var{class} +and uses the get closure to retrieve the slot's value. [ *fixme Need +to insert something here about checking that the value is not unbound. ] +@code{initialize} uses @code{add-method!} to add the returned method to +the generic function named by the slot definition's @code{#:getter} or +@code{#:accessor} option. + +@item +@code{compute-setter-method @var{class} @var{gns}} (generic) + +@code{compute-setter-method} is invoked with the same arguments as +@code{compute-getter-method}, for each of the class's slots that includes +a @code{#:setter} or @code{#:accessor} slot option. The applied method +should create and return a method that is specialized for instances of +type @var{class} and uses the set closure to set the slot's value. +@code{initialize} then uses @code{add-method!} to add the returned method +to the generic function named by the slot definition's @code{#:setter} +or @code{#:accessor} option. +@end itemize + +@node Instance Creation +@section Instance Creation + +@code{make . @var{initargs}} (method) + +@itemize @bullet +@item +@code{allocate-instance @var{class} @var{initargs}} (generic) + +The applied @code{allocate-instance} method should allocate storage for +a new instance of class @var{class} and return the uninitialized instance. + +@item +@code{initialize @var{instance} @var{initargs}} (generic) + +@var{instance} is the uninitialized instance returned by +@code{allocate-instance}. The applied method should initialize the new +instance in whatever sense is appropriate for its class. The method's +return value is ignored. +@end itemize + +@node Class Redefinition +@section Class Redefinition + +The default @code{class-redefinition} method, specialized for classes +with the default metaclass @code{}, has the following internal +protocol. + +@code{class-redefinition @var{(old )} @var{(new )}} +(method) + +@itemize @bullet +@item +@code{remove-class-accessors! @var{old}} (generic) + +@item +@code{update-direct-method! @var{method} @var{old} @var{new}} (generic) + +@item +@code{update-direct-subclass! @var{subclass} @var{old} @var{new}} (generic) +@end itemize + +This protocol cleans up things that the definition of the old class +once changed and modifies things to work with the new class. + +The default @code{remove-class-accessors!} method removes the +accessor methods of the old class from all classes which they +specialize. + +The default @code{update-direct-method!} method substitutes the new +class for the old in all methods specialized to the old class. + +The default @code{update-direct-subclass!} method invokes +@code{class-redefinition} recursively to handle the redefinition of +subclasses. + +When a class is redefined, any existing instance of the redefined class +will be modified for the new class definition before the next time that +any of the instance's slot is referenced or set. GOOPS modifies each +instance by calling the generic function @code{change-class}. + +The default @code{change-class} method copies slot values from the old +to the modified instance, and initializes new slots, as described in +@ref{Changing the Class of an Instance}. After doing so, it makes a +generic function invocation that can be used to customize the instance +update algorithm. + +@code{change-class @var{(old-instance )} @var{(new )}} (method) + +@itemize @bullet +@item +@code{update-instance-for-different-class @var{old-instance} @var{new-instance}} (generic) + +@code{change-class} invokes @code{update-instance-for-different-class} +as the last thing that it does before returning. The applied method can +make any further adjustments to @var{new-instance} that are required to +complete or modify the change of class. The return value from the +applied method is ignored. + +The default @code{update-instance-for-different-class} method does +nothing. +@end itemize + +@node Method Definition +@section Method Definition + +@code{define-method} (syntax) + +@itemize @bullet +@item +@code{add-method! @var{target} @var{method}} (generic) + +@code{define-method} invokes the @code{add-method!} generic function to +handle adding the new method to a variety of possible targets. GOOPS +includes methods to handle @var{target} as + +@itemize @bullet +@item +a generic function (the most common case) + +@item +a procedure + +@item +a primitive generic (@pxref{Extending Guiles Primitives}) +@end itemize + +By defining further methods for @code{add-method!}, you can +theoretically handle adding methods to further types of target. +@end itemize + +@node Generic Function Invocation +@section Generic Function Invocation + +[ *fixme* Description required here. ] + +@code{apply-generic} + +@itemize @bullet +@item +@code{no-method} + +@item +@code{compute-applicable-methods} + +@item +@code{sort-applicable-methods} + +@item +@code{apply-methods} + +@item +@code{no-applicable-method} +@end itemize + +@code{sort-applicable-methods} + +@itemize @bullet +@item +@code{method-more-specific?} +@end itemize + +@code{apply-methods} + +@itemize @bullet +@item +@code{apply-method} +@end itemize + +@code{next-method} + +@itemize @bullet +@item +@code{no-next-method} +@end itemize + +@node Tutorial, Concept Index, MOP Specification, Top +@chapter Tutorial +@include goops-tutorial.texi + +@node Concept Index, Function and Variable Index, Tutorial, Top +@unnumberedsec Concept Index + +@printindex cp + +@node Function and Variable Index, , Concept Index, Top +@unnumberedsec Function and Variable Index + +@printindex fn + +@summarycontents +@contents +@bye diff --git a/guile18/doc/goops/hierarchy.eps b/guile18/doc/goops/hierarchy.eps new file mode 100644 index 0000000000..7b1a98605b --- /dev/null +++ b/guile18/doc/goops/hierarchy.eps @@ -0,0 +1,127 @@ +%!PS-Adobe-2.0 EPSF +%%Title: /tmp/xfig-fig016295 +%%Creator: fig2dev +%%CreationDate: Fri Jun 10 23:18:16 1994 +%%For: eg@kaolin (Erick Gallesio) +%%BoundingBox: 0 0 361 217 +%%Pages: 0 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/l {lineto} bind def +/m {moveto} bind def +/s {stroke} bind def +/n {newpath} bind def +/gs {gsave} bind def +/gr {grestore} bind def +/clp {closepath} bind def +/graycol {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul +4 -2 roll mul setrgbcolor} bind def +/col-1 {} def +/col0 {0 0 0 setrgbcolor} bind def +/col1 {0 0 1 setrgbcolor} bind def +/col2 {0 1 0 setrgbcolor} bind def +/col3 {0 1 1 setrgbcolor} bind def +/col4 {1 0 0 setrgbcolor} bind def +/col5 {1 0 1 setrgbcolor} bind def +/col6 {1 1 0 setrgbcolor} bind def +/col7 {1 1 1 setrgbcolor} bind def + end +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def +%%EndProlog + +$F2psBegin +0 setlinecap 0 setlinejoin +-216.0 288.0 translate 0.900 -0.900 scale +0.500 setlinewidth +n 309 159 m 309 159 l gs col-1 s gr +n 246.401 216.889 m 244.000 209.000 l 249.831 214.831 l gs 2 setlinejoin col-1 s gr +% Polyline +n 244 209 m 274 259 l gs col-1 s gr +n 298.169 214.831 m 304.000 209.000 l 301.599 216.889 l gs 2 setlinejoin col-1 s gr +% Polyline +n 304 209 m 274 259 l gs col-1 s gr +n 255.721 213.778 m 249.000 209.000 l 257.179 210.053 l gs 2 setlinejoin col-1 s gr +% Polyline +n 249 209 m 364 254 l gs col-1 s gr +n 370.312 216.376 m 374.000 209.000 l 374.217 217.243 l gs 2 setlinejoin col-1 s gr +% Polyline +n 374 209 m 364 254 l gs col-1 s gr +n 283.772 280.725 m 279.000 274.000 l 286.376 277.688 l gs 2 setlinejoin col-1 s gr +% Polyline +n 279 274 m 314 304 l gs col-1 s gr +n 351.457 272.333 m 359.000 269.000 l 353.913 275.490 l gs 2 setlinejoin col-1 s gr +% Polyline +n 359 269 m 314 304 l gs col-1 s gr +n 300.950 165.789 m 309.000 164.000 l 302.739 169.367 l gs 2 setlinejoin col-1 s gr +% Polyline +n 309 164 m 249 194 l gs col-1 s gr +n 307.000 172.000 m 309.000 164.000 l 311.000 172.000 l gs 2 setlinejoin col-1 s gr +% Polyline +n 309 164 m 309 199 l gs col-1 s gr +n 315.261 169.367 m 309.000 164.000 l 317.050 165.789 l gs 2 setlinejoin col-1 s gr +% Polyline +n 309 164 m 379 199 l gs col-1 s gr +n 406.949 101.701 m 404.000 94.000 l 410.226 99.407 l gs 2 setlinejoin col-1 s gr +% Polyline +n 404 94 m 439 144 l gs col-1 s gr +n 410.363 99.245 m 404.000 94.000 l 412.083 95.634 l gs 2 setlinejoin col-1 s gr +% Polyline +n 404 94 m 509 144 l gs col-1 s gr +n 411.173 98.068 m 404.000 94.000 l 412.243 94.214 l gs 2 setlinejoin col-1 s gr +% Polyline +n 404 94 m 584 144 l gs col-1 s gr +n 396.075 96.277 m 404.000 94.000 l 398.079 99.739 l gs 2 setlinejoin col-1 s gr +% Polyline +n 404 94 m 309 149 l gs col-1 s gr +% Polyline +n 584 229 m 584 204 l gs col-1 s gr +n 582.000 212.000 m 584.000 204.000 l 586.000 212.000 l gs 2 setlinejoin col-1 s gr +% Polyline +n 584 189 m 584 159 l gs col-1 s gr +n 582.000 167.000 m 584.000 159.000 l 586.000 167.000 l gs 2 setlinejoin col-1 s gr +/Times-Bold findfont 12.00 scalefont setfont +239 209 m +gs 1 -1 scale (A) col-1 show gr +/Times-Bold findfont 12.00 scalefont setfont +274 274 m +gs 1 -1 scale (D) col-1 show gr +/Times-Bold findfont 12.00 scalefont setfont +359 269 m +gs 1 -1 scale (E) col-1 show gr +/Times-Bold findfont 12.00 scalefont setfont +304 209 m +gs 1 -1 scale (B) col-1 show gr +/Times-Bold findfont 12.00 scalefont setfont +374 209 m +gs 1 -1 scale (C) col-1 show gr +/Times-Bold findfont 12.00 scalefont setfont +314 319 m +gs 1 -1 scale (F) col-1 show gr +/Times-Bold findfont 12.00 scalefont setfont +289 159 m +gs 1 -1 scale () col-1 show gr +/Times-Bold findfont 12.00 scalefont setfont +389 89 m +gs 1 -1 scale () col-1 show gr +/Times-Bold findfont 12.00 scalefont setfont +424 154 m +gs 1 -1 scale () col-1 show gr +/Times-Bold findfont 12.00 scalefont setfont +474 154 m +gs 1 -1 scale () col-1 show gr +/Times-Bold findfont 12.00 scalefont setfont +559 154 m +gs 1 -1 scale () col-1 show gr +/Times-Bold findfont 12.00 scalefont setfont +629 154 m +gs 1 -1 scale (...) col-1 show gr +/Times-Bold findfont 12.00 scalefont setfont +569 199 m +gs 1 -1 scale () col-1 show gr +/Times-Bold findfont 12.00 scalefont setfont +559 239 m +gs 1 -1 scale () col-1 show gr +$F2psEnd diff --git a/guile18/doc/goops/hierarchy.pdf b/guile18/doc/goops/hierarchy.pdf new file mode 100644 index 0000000000..3a19ba4eb4 --- /dev/null +++ b/guile18/doc/goops/hierarchy.pdf @@ -0,0 +1,74 @@ +%PDF-1.3 +%Ç쏢 +5 0 obj +<> +stream +xœm”Ën1 E÷ú +-íÅ°¢(êš6-Ð][ï‚.Ç Äy¸)úû½Ò¼ÛÀ‘wŽ(Šä«uÄÖÕgø_o͇ÉÞý1Ôþ3l_Môl9„b·óë£ùi¼}0š(:U[|†[¢-¥:s¦"V!’zirù €ÒE«û/Nú-À#K5n[ŒœÑ{ âÀr¶E#¼™]±%—w ‚­af€J˜Aœ<#ž"§ªðn ¯‰J=u ŒïFÚ$9Á“"T‚ZQAn*P”mજH²XɎ²+sºd"ñstÎ 1¼¾sUÁ.a©-<ç•pSÁ9Chፒcž†L’eÉ8ÙtÓ®*4"w!çJi¢MŠ–ff™iÑ Ôâßs¢”Þz‚Ð^]žï1&¤dÞô=©¬E8{Ç^x¬ÎㄖK=M»!T¨õ®…ÍŠk®A—¬${›4Ð'!kÞ»!ŸêW‘ò)MŠ%’“Dü1àÊĂãG©èÕ\—ˆ6dŠ+ñ€‰”PL5ô2ƒ÷„²À<‰žd¶ÄªôÉld.Ó^n¯ŒÄ%´LòNaq5O…ÝœÈè$Ü*ÂÒ7ɞ·aš½çܙWÔt›]Ãßzk/V˜bødW¿M?ÚØv•R +~V[³ø¸\aƘë…oW·fñ¹Úæ ƒå²Zº€‰S-W‹‹e§#‰,>-­¾™b;ô{UijdS[gUÓÙóÍÃfýv^=ÅÙ(½õíùåü8€«ÅÙËõýî|Ù±GéĄõîy½¹ý»ÛT£¢°íÙÓßíͦÉ µP°®¼ZAý>»ÍõcÛ¨C”½Íxÿô¶¹«ßÃ~¹2ßñü(8endstream +endobj +6 0 obj +660 +endobj +4 0 obj +<> +/Contents 5 0 R +>> +endobj +3 0 obj +<< /Type /Pages /Kids [ +4 0 R +] /Count 1 +>> +endobj +1 0 obj +<> +endobj +7 0 obj +<>endobj +9 0 obj +<> +endobj +10 0 obj +<> +endobj +8 0 obj +<> +endobj +2 0 obj +<>endobj +xref +0 11 +0000000000 65535 f +0000000973 00000 n +0000001186 00000 n +0000000914 00000 n +0000000764 00000 n +0000000015 00000 n +0000000745 00000 n +0000001021 00000 n +0000001121 00000 n +0000001062 00000 n +0000001091 00000 n +trailer +<< /Size 11 /Root 1 0 R /Info 2 0 R +/ID [(¿Ccežò3f¾q\\[)(¿Ccežò3f¾q\\[)] +>> +startxref +1379 +%%EOF diff --git a/guile18/doc/goops/hierarchy.png b/guile18/doc/goops/hierarchy.png new file mode 100644 index 0000000000000000000000000000000000000000..46f58b051cd7ef7d57dbf3305c447f79c13bbdc0 GIT binary patch literal 6251 zcmY*eXEa=0xE@3eAxZ?%qkV*k8eNE9CQ6hsh!SOpIz$(Jh)(nxL?1?rE=qJGQHL-Q zozasa>OHyl*ZpzUe%HItQ{HEvAA7BX0PCq!Q7}`0Kp-kj4OIgWhyV{f!el@LWVYwV z1uTR%+UlyHo9M)`ZV>4HLrqm>qqn(xc_BlWL(oC&#U94Wb0ARuKMMH?Id@C>xb@?$ zZ(Q=pw;q+oj40&Nn-?XO7M7c4^%R{Yrj&*t!tA~&?odw)g@GS^h%l(W=6v|PzI5-4 zn!qEj8bq48+@D4wc0yhh9=>&l*1UQxrSN@_oJ0P@E)`sBVZ2wWBD( z#jQ!&oqp$8?r=vCwf8enR$MX*#0Xj;J;b6 zQt@;saVhN!)=vVjq@#Xjk84 zbQ_?%_`n3JIqfxmnQOBV4qs7ya!Gb4^Ms*xFq^nXWFU4(^<8FP*>SIF#K8-rGB*3D zyL7~9wB-a%#^rZPL&+n-T7?0I*u2kU%e9)#J}ZAHw!0lky`Rgdq#ll-F_ zgU%hq|Hl>@0Ncr-DS*KCQeOTrhh;QA8|l)>&paoYzk9vT9=JR17PJciDe-vrS`Nm) z-$NXP{Oz{75~W6l^s(goZxidjNULzubbOzacK;Sc!BryP)hC71bF9%7sWC)*9qDsBUpvm4FsYEuoun6_ngM%I0bWc~`oDhEh6w%I?0R0O5SvDhQPt zskxzZ$Pe{O8;=4|RC_k;U2!oh8?FH@iWAr%Y=-hO!fdo_F^f^(f;MGt&)CxDT5l~(Zv~$aDgn}RM z#?sfc(`u6)Z*T=P(LwaTRSO!R_O*TlCP`6ac5~;mtF&H2x0g_Gli-^V;T=zhED!o; z-CxZzRMY`)xg<#uVPvUy_=LyXxQu6^h(*fdh>Xrix`4d@8ft$dw03I)sihd#$b|z0 z`I@7g8)`M0;3i$kixkKGA396vASTb6%uLp@;U>SL!sL?e-46OKH!Fco8_-b;lk>1Y z_yx!<0j6x1(mzLX=o?{VW$GoSGvUvj0pDKK$G6ghdP?@fWB}?;V6<7~{3O(=hYixu zZ8lwD(RwLeQDKflUkP*Zv|d6y6JEN&0^k||o2i{GbP$zPGn20HgkJRHAv#^358>y@ zuL0kGC4o`=i2ZDa6^0NsMe$}PCFuaSnsUAdiW+VMbF`mjaB^Bo&(uufOTzW#&F?mf z@5VMZ?`w^54AH6i+|zTRas?9E1Eh*c{lbPO{?P!Fmc+qLo~?1{lVLD`okpqMSZ^R~ zGL|(2hir!CA~AHV?R)xCb^GxQ7m450=)^1l100q#0I<&-ZqAr2*?I|YF#y)GuNA|v zrYk5*&DUJkoB*8B4%;l0+#{?*)1KV{toRMc?E7GwAg4x>R1vNtcb?fF$m|^W9Bz>v z^QPu~q=Ohbu>+x5?bi19D=!<9Y}f#TP>I_Hq<7_DCv_V)rPaxUl6`;JG0uY`o`J}%=&&_^l2pAm|`Ow*ipgZtX23hZ{YH&(j8G zZ3BQD0MOmFc#aEiU<#M9HZDp)X)IiBAEm$3Z^^e%x4%J<-|L{vR)y~~!z1$MnYk3| z)%qpU8__#%u}B=D?!v>(!?7)#n}mMPHMG|dKNJQ|ZFb(j>&_1+KEyqz3UNH@uw(p+ z$cs1=o%^-)WkAu!gCzq;IYX!aXQ=J$g}V#xA}Dbb=^o?=t1W%5J2TKCC=>4a1@Sjc zHlim&3m(e<*j9_)k!^-Ri~OhKB+shCkwa<4ARw%%y#{j;Sr`C-efWD-O;uq7?r~4k86O%DMZ)c&YdPF8;^6? zrYhT%3+-n%yGO!Tp+kDM2J$bhbxXc_Q04_)2*}+jY zIFEQ-eQ#rBf;5IdSAu><+5OuBbs1qpTk06#qswuRO?OeO)TotLwn(=r4d(2)=WOYC z4M7UXNauF(vtX##&blQ+U@-7b8)fA#`HMmtErLW^8jd^P?~0X)(tw$_LW4WiwE!+X zWTB5_Go2&p&Xq)3=mIHW28oi+)PKjnsJGjxnjXMn-$|>aezA>R6x4V(-s5v(VgsVw$!babi=C=d@+R?tI}TwK14tf2tQZx~TUy9M{cw zGreJs%BE;Mk8cu`vCqT}eimb2Kc*48EltMrmc?dgVG!%PYn@7Mb}BbKLnx|)-yv(c z@329&Cavwv7y%+P2V$H*$zNzZ>{DRZHjSZAke|?I_{U3+l$>xOL?+NRE z`U)m=b}M8pX9ROJLx4@u`^(re0?&Kq8=M>OUMF|#ynZFj0}hw;s9uvPxEB8yW?Bv0 zR@QkeUz8v#*~kw#7#As5>@SIP!p?*$pA`SBpRkSp)$2!4U~5QIu(`LpRv#Ky;-G)L zmP($JQl^jq{{HUj(_t!%m&d~#%Dtj|)_a>XC*^GDnh&XJF#?rdX+S?o$@@z?!cVDq zfyDM6$erHNrE`;5s@9}e(##Z6c93blc$LYI4qUOa48RUrU2op_A!(mYi61fQq9cP! zIE}I>_jP3df}2>^k!dYAQ*)M=haw$&O;-z3+-gOiZjr&29HvIa((@c4Dq=TN#z*h< z6@E7CWhK3Z3#V^Or)dS!mlE<lSA!9s&l$-W`wC@(2&NL~P@+uk zjN1yOx8yhEcQjUr3)^uj&q+%TQ>To5 z?iCXmoFTS(Wd*+x2wawUC+C#{G{MgnMkmYx8bu~o`%O-OrXa=#bwUf!=s#n@_{9P= ze1&E{%m2{doKk`)|DlJbM-@K&LmTbbu^awFbIsYaL;e-ab9M#K{uQ({D19D)52<3? z^s!D0FYwRE+^Y|eLj!!pzxs#3sBjoS(#2%kv=id-!smr5(AE8{BCL=BeF(?|jx^=E zQ^=GB%WhiuX!8RdIhudh`j=HpSI*tt5GGD*dCR4X?e^imrDm*v==+JgUBGK=?q%Y)TveP9h?>o~2+Dai* zmA;o3{r_q>QucQ?cpQ#wjeVR9_e)m#y@5b@CTr?(Gyj&>rJNIEiIy|9@D}#+%H7I~ zR{?J7Yy^i=l()rSR?RrWTUOj>am%JP`z_SC+m;+@2CPCSwf;&vaE<#tg?|L=3!OT6&uo74_Js!6psxz~D;t52$agqeTvmeAzWps4kKw#9J0`6%F*=%_P6RE%G>pHB?>moSnBsKU$n^c#oA8>_;!h z=#93ui-`rg+vJDlngdWI7=OEuX|Q(t)B2 z0*-fYt^>DN)UZ7Yen%_^uYBDc0)I;g4@}&)A`+MEyyOOfmoId=3DOip))5C+swMuG z=-27@v4J90K`g|@XobO#^I0pqW=}q>lvKei{Wqu72(9;mEt@_DR9Q9V-q-Iw;osJ3}d0*D6G?N^Rs=rljWssx!)MaSc+fr<_@gm_H{O=&@zig<2gB`7Zn!|iDBt+RVnleNbJPp|ab;u} zLXn}tM)hI|krLM@k+0&+my2^|uSot-l+3-myz}Cq3SrgHW z|GY=Srk(0wcw7U_ToulzGncS$buEW}t2Z(cK59#44w&2z{&_PCOW0dVqQ-i@jr4Y8 zongh)Dq?IO=>?RS^}UNF8d*?-3k>J~HjSGizzlj7?%=XJu`Bf>YG^gQ9?V0=di#6L zu%_v_eN_TCj&>&R^63EO*i{fZ)eV+Zb9Ji$cQ>8S7#_2ub!~yd3c{M-b-v${2K${k zUX<73(0T3BE~b@cULhgZu}f-mX**uqw0*FdJd3{;C+4|$A-Mgx{Dl9HHR0C~|35GK zTszwYum5ky(=k!#*5;~9U;Z_l=EK@IrEluB+k9G@+GklwHkaxZv3hR_=_>DlS>5Re ziZEFXwG{G&@9uys@v)!;61vKzJ(D0^yh@H?P}6w_aeYme@~8F+ep?UJCnj#2(66Ds z(mb&msp^hogqeS<#E}t;PZ9kyVyuXzw>3+Fs0at=zU+>cx+%c~ChpKFM&g8FZd8Fi z(s3E;tHb4Cj5md)RQ;t(Ghmj@e)=HjOjufP?PNRgjVzvJyx}C!E z^IRR;uwpRfYNl@O%o?3fCo{V0z8U)Q8GI{!R!<<__<76frLpkE7b9z*t##P-GvLgH zKW+9WbiKJyH)umxnv63SD{+d_Y+9ue*5~mga#Z}l0FG5pAJR&oq*UQlM?aoBsqQAX z{^z*k`6fA&f06)7s+831Eisg$z6GM+Ow%IdXbhl5w22d@2UvSGYi=6a2Yi;kEdg_W zqUQ1lr1h`qbn~kxv$eQW z&FCiS-p zTmPH3P+)hpiLXxORK;k&yi(~+_%BtJXLUP6HCA#aWdp6!o-Fiy*~dM`YVgk0R@!)& z2k>np%BH)FcXu-P++5A$8m7}FE}h2CP4CW#E@SoPW-lN}zk~qt5zGjn|3T7v{J>gjH5D&W!`M2TkMyo1j$J) zJUkXwg$JSq1#smli-n)R6*n;!%S>#h)B6|=&rZZk)?5k2uF|2?t41vzFn#m*n2zH^ zCZsFQsWzVc@eN8@^((vmNtZ7qcIPZ#(KpJOwDQDob-GD)p$RWnxypjpRQm{pp^Igf zH_@73i|t|RHg8Axk8Ob4Tz1LcqWDvgEWbfiQTs~=keV6Fx zrSZG$8c8_H)~FQfr7;WxzqKp*0d!NXOZ9?-oyfgNU8Ci7@EAOK^6kmd51tAccK=2^ zPL>bfjtu#7#T2}*4f@9GKD>X;-hK7eDz);YEE;!Ldc2%_R6_wzEu!!UUA3Y|jcMJJ z!B)IG-t9g*{hqw8&)5Eyl-9mQ?CJ0uJ{Fv=y72s}enygT-pimlb*mL`k#FHnZ^ZpV z2gtlFjsCcyYZO#Jk5%Cz>bo8(H6^5ZgZP7+DTl5zI+iG=ZqMqxPXq>kUTm>_ud(t! zuh^uV?d2np8xy5xb6Y3?=xY(2S2{m~~O78uoudGgj zHMf+yH}|r;PAQ`rKKF<| zkW=I%dk@;cFk)CT=+HwaJtawkv_)^YrX({R|1|bBw<9cnKC#GaGoLVLXR6e_INab~ z_G!+0+(m{l?qfuCUg9HhFX8ChWr*IC@qcbVQL~vr_>37{W45_z5|(+-)w)m zMm`BEpdr!b54iQ)b6HYUXQFnSc`}-XtDr-NB8NMUR(t#L&4-ib;a3fMUD`?_o34aC z&H<{sp_UVis-a7*-d!`ig&F9@h|m>}h?TEzeq;z0v>*ujWgb&l@b%%nINXg-<=0e~7`mzp*E)lylyf6<( z3#C1d4tc0=m;dtUCw76M_X##Mg537~9_`A{AHx@+4;F|c8lbkI)9+PxsaxA#CtoVM YNo&k>O)1d)`-`CYTu-(3nRVFz0D~=CyZ`_I literal 0 HcmV?d00001 diff --git a/guile18/doc/goops/hierarchy.txt b/guile18/doc/goops/hierarchy.txt new file mode 100644 index 0000000000..c7992df7b3 --- /dev/null +++ b/guile18/doc/goops/hierarchy.txt @@ -0,0 +1,14 @@ + + / \\\_____________________ + / \\___________ \ + / \ \ \ + + / | \ | + / | \ | + A B C + |\__/__ | | + \ / \ / | + D E + \ / | + F | + diff --git a/guile18/doc/goops/mop.text b/guile18/doc/goops/mop.text new file mode 100644 index 0000000000..0180f2c1e8 --- /dev/null +++ b/guile18/doc/goops/mop.text @@ -0,0 +1,66 @@ +*** NOTE: This information needs updating! *** + +P - procedure +L - local procedure +S - syntax +G - generic +M - method + +define-class (S) + make-class (S) + ensure-metaclass (P) + ensure-metaclass-with-supers (P) + make (G) + ensure-class (P) + make (G) + class-redefinition (G) + remove-class-accessors (G) + update-direct-method (G) + update-direct-subclass (G) + +define-generic (S) + make-generic-function (S) + ensure-generic-function (P) + make (G) + +define-method (S) + ensure-method (P) + ensure-generic-function (P) + make (G) + make (G) + add-method (P) + +method (S) + ensure-method (P) + +initialize (class) (M) + compute-cpl (P) + compute-slots (G) + compute-getters-n-setters (P) + compute-slot-init-function (L) + compute-get-n-set (G) + compute-slot-accessors (P) + ensure-method (P) + %inherit-magic! (P) + %prep-layout! (P) + +initialize (generic) (M) + make (G) + +change-class (G) + change-object-class (P) + update-instance-for-different-class (G) + +make = make-instance (G) + allocate-instance (G) + %allocate-instance (P) + initialize (G) + %initialize-object (P) + +apply-generic (G) + compute-applicable-methods (G) + find-method (P) + sort-applicable-methods (G) + sort (P) + apply-methods (G) + apply-method (G) diff --git a/guile18/doc/groupings.alist b/guile18/doc/groupings.alist new file mode 100644 index 0000000000..ed5bb1fca1 --- /dev/null +++ b/guile18/doc/groupings.alist @@ -0,0 +1,176 @@ +;;; groupings.alist -*-scheme-*- + +;; Copyright (C) 2002, 2006 Free Software Foundation, Inc. +;; +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation; either version 2, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this software; see the file COPYING. If not, write to +;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301 USA + +;;; Commentary: + +;; This file describes interface element groupings. +;; See (scripts scan-api) commentary for more info. +;; NOTE: Order matters; put simple ones first, composites after. +;; +;; TODO: Add goops, add math, etc etc. +;; Group `guile-C-API' needs much more serious thought. + +;;; Code: + +( + + ;; Integrity checks + + (C+scheme + (description "in both groups `scheme' and `C' -- should be empty!") + (grok () (lambda (x) + (and (in-group? x 'Scheme) + (in-group? x 'C))))) + + ;; Embedded foreign libraries + + (embedded-libltdl + (description "begins with lt_ -- should become empty over time") + (grok () (lambda (x) + (name-prefix? x "lt_")))) + + ;; By name + + (libguile-internal + (description "begins with scm_i_") + (grok () (lambda (x) + (name-prefix? x "scm_i_")))) + + (gdb + (description "begins with gdb_") + (grok () (lambda (x) + (name-prefix? x "gdb_")))) + + (coop + (description "begins with coop_") + (grok () (lambda (x) + (name-prefix? x "coop_")))) + + (gh + (description "begins with gh_") + (grok () (lambda (x) + (name-prefix? x "gh_")))) + + (g-fdes + (description "begins with g and ends with fds") + (grok () (lambda (x) + (name-prefix? x "g.+fds$")))) + + (r-fdes + (description "begins with r and ends with fds") + (grok () (lambda (x) + (name-prefix? x "r.+fds$")))) + + (scm + (description "begins with scm_") + (grok () (lambda (x) + (name-prefix? x "scm_")))) + + (k + (description "constants") + (grok () (lambda (x) + (name-prefix? x "[_A-Z0-9]+$")))) + + (POSIX + (description "POSIX support") + (members ; from docs + + ;; ports and file descriptors + port-revealed set-port-revealed! fileno port->fdes fdopen fdes->ports + fdes->inport fdes->outport primitive-move->fdes move->fdes + release-port-handle fsync open open-fdes close close-fdes unread-char + unread-string pipe dup->fdes dup->inport dup->outport dup dup->port + duplicate-port redirect-port dup2 port-mode close-all-ports-except + port-for-each setvbuf fcntl flock select + O_RDONLY O_WRONLY O_RDWR O_APPEND O_CREAT _IONBF _IOLBF _IOFBF + F_DUPFD F_GETFD F_SETFD F_GETFL F_SETFL F_GETOWN F_SETOWN FD_CLOEXEC + LOCK_SH LOCK_EX LOCK_UN LOCK_NB + + ;; file system + access? stat lstat readlink chown chmod utime delete-file copy-file + rename-file link symlink mkdir rmdir opendir directory-stream? readdir + rewinddir closedir sync mknod tmpnam mkstemp! dirname basename + R_OK W_OK X_OK F_OK + stat:perms stat:type stat:blocks stat:blksize stat:ctime stat:mtime + stat:atime stat:size stat:rdev stat:gid stat:uid stat:nlink stat:mode + stat:ino stat:dev + + ;; user information + passwd:name passwd:passwd passwd:uid passwd:gid passwd:gecos passwd:dir + passwd:shell group:name group:passwd group:gid group:mem + getpwuid getpwnam name setpwent getpwent endpwent setpw getpw getgrgid + getgrnam setgrent getgrent endgrent setgr getgr cuserid getlogin + + ;; time + tm:sec set-tm:sec tm:min set-tm:min tm:hour set-tm:hour tm:mday set-tm:mday + tm:mon set-tm:mon tm:year set-tm:year tm:wday set-tm:wday tm:yday + set-tm:yday tm:isdst set-tm:isdst tm:gmtoff set-tm:gmtoff tm:zone + set-tm:zone tms:clock tms:utime tms:stime tms:cutime tms:cstime + current-time gettimeofday localtime gmtime mktime tzset strftime strptime + times get-internal-real-time get-internal-run-time + + ;; runtime environment + program-arguments command-line getenv setenv environ putenv + + ;; proceses + chdir getcwd umask chroot getpid getgroups getppid getuid getgid geteuid + getegid setuid setgid seteuid setegid getpgrp setpgid setsid waitpid + status:exit-val status:term-sig status:stop-sig system primitive-exit execl + execlp execle primitive-fork nice setpriority getpriority + WNOHANG WUNTRACED + + ;; signals + kill raise sigaction restore-signals alarm pause sleep usleep setitimer + getitimer SIGHUP SIGINT + + ;; terminals and ptys + isatty? ttyname ctermid tcgetpgrp tcsetpgrp + + ;; pipes -- not included because they are in (ice-9 popen) + + ;; system identification + utsname:sysname utsname:nodename utsname:release utsname:version + utsname:machine uname gethostname sethostname software-type + + ;; locales + setlocale + LC_ALL LC_COLLATE LC_CTYPE LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME + + ;; encryption + crypt getpass)) + + (math + (description "math functions") + (members $abs $acos $acosh $asin $asinh $atan $atan2 $atanh $cos $cosh + $exp $expt $log $sin $sinh $sqrt $tan $tanh)) + + ;; By composition (these must be AFTER their constituent groupings) + + (guile-C-API + (description "the official guile API available to C programs") + (grok () (lambda (x) + (and (in-group? x 'C) + (or (in-group? x 'gh) + (in-group? x 'coop) + (in-group? x 'gdb)))))) + + ;; Add new grouping descriptions here. + ) + +;;; groupings.alist ends here diff --git a/guile18/doc/guile-api.alist b/guile18/doc/guile-api.alist new file mode 100644 index 0000000000..5f73cae3a3 --- /dev/null +++ b/guile18/doc/guile-api.alist @@ -0,0 +1,3219 @@ +;;; generated 2002-05-12 05:25:39 UTC by scan-api -- do not edit! + +( +(meta + (GUILE_LOAD_PATH . "") + (LTDL_LIBRARY_PATH . "") + (guile . "pre-inst-guile") + (libguileinterface . "15:0:0") + (sofile . "libguile/.libs/libguile.so.15.0.0") + (groups C+scheme embedded-libltdl libguile-internal gdb coop gh g-fdes r-fdes scm k POSIX math guile-C-API Scheme C) +) ;; end of meta +(interface +($abs (groups math Scheme) (scan-data "#")) +($acos (groups math Scheme) (scan-data "#")) +($acosh (groups math Scheme) (scan-data "#")) +($asin (groups math Scheme) (scan-data "#")) +($asinh (groups math Scheme) (scan-data "#")) +($atan (groups math Scheme) (scan-data "#")) +($atan2 (groups math Scheme) (scan-data "#")) +($atanh (groups math Scheme) (scan-data "#")) +($cos (groups math Scheme) (scan-data "#")) +($cosh (groups math Scheme) (scan-data "#")) +($exp (groups math Scheme) (scan-data "#")) +($expt (groups math Scheme) (scan-data "#")) +($log (groups math Scheme) (scan-data "#")) +($sin (groups math Scheme) (scan-data "#")) +($sinh (groups math Scheme) (scan-data "#")) +($sqrt (groups math Scheme) (scan-data "#")) +($tan (groups math Scheme) (scan-data "#")) +($tanh (groups math Scheme) (scan-data "#")) +(%cond-expand-features (groups Scheme) (scan-data "")) +(%cond-expand-table (groups Scheme) (scan-data "")) +(%deliver-signals (groups Scheme) (scan-data "#")) +(%get-pre-modules-obarray (groups Scheme) (scan-data "#")) +(%guile-build-info (groups Scheme) (scan-data "")) +(%init-goops-builtins (groups Scheme) (scan-data "#")) +(%init-rdelim-builtins (groups Scheme) (scan-data "#")) +(%init-rw-builtins (groups Scheme) (scan-data "#")) +(%library-dir (groups Scheme) (scan-data "#")) +(%load-announce (groups Scheme) (scan-data "#")) +(%load-extensions (groups Scheme) (scan-data "")) +(%load-hook (groups Scheme) (scan-data "#")) +(%load-path (groups Scheme) (scan-data "")) +(%load-verbosely (groups Scheme) (scan-data "")) +(%make-void-port (groups Scheme) (scan-data "#")) +(%module-public-interface (groups Scheme) (scan-data "")) +(%nil (groups Scheme) (scan-data "")) +(%package-data-dir (groups Scheme) (scan-data "#")) +(%print-module (groups Scheme) (scan-data "#")) +(%print-values (groups Scheme) (scan-data "#")) +(%search-load-path (groups Scheme) (scan-data "#")) +(%site-dir (groups Scheme) (scan-data "#")) +(* (groups Scheme) (scan-data "#")) +(*features* (groups Scheme) (scan-data "")) +(*null-device* (groups Scheme) (scan-data "")) +(*random-state* (groups Scheme) (scan-data "")) +(*unspecified* (groups Scheme) (scan-data "")) +(+ (groups Scheme) (scan-data "#")) +(- (groups Scheme) (scan-data "#")) +(->bool (groups Scheme) (scan-data "#bool (x)>")) +(/ (groups Scheme) (scan-data "#")) +(1+ (groups Scheme) (scan-data "#")) +(1- (groups Scheme) (scan-data "#")) +(< (groups Scheme) (scan-data "#")) +(<= (groups Scheme) (scan-data "#")) +( (groups Scheme) (scan-data "")) +( (groups Scheme) (scan-data "")) +( (groups Scheme) (scan-data "")) +(= (groups Scheme) (scan-data "#")) +(> (groups Scheme) (scan-data "#>")) +(>= (groups Scheme) (scan-data "#=>")) +(@apply (groups Scheme) (scan-data "")) +(@bind (groups Scheme) (scan-data "")) +(@call-with-current-continuation (groups Scheme) (scan-data "")) +(@call-with-values (groups Scheme) (scan-data "")) +(@fop (groups Scheme) (scan-data "")) +(AF_INET (groups k Scheme) (scan-data "")) +(AF_INET6 (groups k Scheme) (scan-data "")) +(AF_UNIX (groups k Scheme) (scan-data "")) +(AF_UNSPEC (groups k Scheme) (scan-data "")) +(E2BIG (groups k Scheme) (scan-data "")) +(EACCES (groups k Scheme) (scan-data "")) +(EADDRINUSE (groups k Scheme) (scan-data "")) +(EADDRNOTAVAIL (groups k Scheme) (scan-data "")) +(EADV (groups k Scheme) (scan-data "")) +(EAFNOSUPPORT (groups k Scheme) (scan-data "")) +(EAGAIN (groups k Scheme) (scan-data "")) +(EALREADY (groups k Scheme) (scan-data "")) +(EBADE (groups k Scheme) (scan-data "")) +(EBADF (groups k Scheme) (scan-data "")) +(EBADFD (groups k Scheme) (scan-data "")) +(EBADMSG (groups k Scheme) (scan-data "")) +(EBADR (groups k Scheme) (scan-data "")) +(EBADRQC (groups k Scheme) (scan-data "")) +(EBADSLT (groups k Scheme) (scan-data "")) +(EBFONT (groups k Scheme) (scan-data "")) +(EBUSY (groups k Scheme) (scan-data "")) +(ECHILD (groups k Scheme) (scan-data "")) +(ECHRNG (groups k Scheme) (scan-data "")) +(ECOMM (groups k Scheme) (scan-data "")) +(ECONNABORTED (groups k Scheme) (scan-data "")) +(ECONNREFUSED (groups k Scheme) (scan-data "")) +(ECONNRESET (groups k Scheme) (scan-data "")) +(EDEADLK (groups k Scheme) (scan-data "")) +(EDEADLOCK (groups k Scheme) (scan-data "")) +(EDESTADDRREQ (groups k Scheme) (scan-data "")) +(EDOM (groups k Scheme) (scan-data "")) +(EDOTDOT (groups k Scheme) (scan-data "")) +(EDQUOT (groups k Scheme) (scan-data "")) +(EEXIST (groups k Scheme) (scan-data "")) +(EFAULT (groups k Scheme) (scan-data "")) +(EFBIG (groups k Scheme) (scan-data "")) +(EHOSTDOWN (groups k Scheme) (scan-data "")) +(EHOSTUNREACH (groups k Scheme) (scan-data "")) +(EIDRM (groups k Scheme) (scan-data "")) +(EILSEQ (groups k Scheme) (scan-data "")) +(EINPROGRESS (groups k Scheme) (scan-data "")) +(EINTR (groups k Scheme) (scan-data "")) +(EINVAL (groups k Scheme) (scan-data "")) +(EIO (groups k Scheme) (scan-data "")) +(EISCONN (groups k Scheme) (scan-data "")) +(EISDIR (groups k Scheme) (scan-data "")) +(EISNAM (groups k Scheme) (scan-data "")) +(EL2HLT (groups k Scheme) (scan-data "")) +(EL2NSYNC (groups k Scheme) (scan-data "")) +(EL3HLT (groups k Scheme) (scan-data "")) +(EL3RST (groups k Scheme) (scan-data "")) +(ELIBACC (groups k Scheme) (scan-data "")) +(ELIBBAD (groups k Scheme) (scan-data "")) +(ELIBEXEC (groups k Scheme) (scan-data "")) +(ELIBMAX (groups k Scheme) (scan-data "")) +(ELIBSCN (groups k Scheme) (scan-data "")) +(ELNRNG (groups k Scheme) (scan-data "")) +(ELOOP (groups k Scheme) (scan-data "")) +(EMFILE (groups k Scheme) (scan-data "")) +(EMLINK (groups k Scheme) (scan-data "")) +(EMSGSIZE (groups k Scheme) (scan-data "")) +(EMULTIHOP (groups k Scheme) (scan-data "")) +(ENAMETOOLONG (groups k Scheme) (scan-data "")) +(ENAVAIL (groups k Scheme) (scan-data "")) +(ENETDOWN (groups k Scheme) (scan-data "")) +(ENETRESET (groups k Scheme) (scan-data "")) +(ENETUNREACH (groups k Scheme) (scan-data "")) +(ENFILE (groups k Scheme) (scan-data "")) +(ENOANO (groups k Scheme) (scan-data "")) +(ENOBUFS (groups k Scheme) (scan-data "")) +(ENOCSI (groups k Scheme) (scan-data "")) +(ENODATA (groups k Scheme) (scan-data "")) +(ENODEV (groups k Scheme) (scan-data "")) +(ENOENT (groups k Scheme) (scan-data "")) +(ENOEXEC (groups k Scheme) (scan-data "")) +(ENOLCK (groups k Scheme) (scan-data "")) +(ENOLINK (groups k Scheme) (scan-data "")) +(ENOMEM (groups k Scheme) (scan-data "")) +(ENOMSG (groups k Scheme) (scan-data "")) +(ENONET (groups k Scheme) (scan-data "")) +(ENOPKG (groups k Scheme) (scan-data "")) +(ENOPROTOOPT (groups k Scheme) (scan-data "")) +(ENOSPC (groups k Scheme) (scan-data "")) +(ENOSR (groups k Scheme) (scan-data "")) +(ENOSTR (groups k Scheme) (scan-data "")) +(ENOSYS (groups k Scheme) (scan-data "")) +(ENOTBLK (groups k Scheme) (scan-data "")) +(ENOTCONN (groups k Scheme) (scan-data "")) +(ENOTDIR (groups k Scheme) (scan-data "")) +(ENOTEMPTY (groups k Scheme) (scan-data "")) +(ENOTNAM (groups k Scheme) (scan-data "")) +(ENOTSOCK (groups k Scheme) (scan-data "")) +(ENOTTY (groups k Scheme) (scan-data "")) +(ENOTUNIQ (groups k Scheme) (scan-data "")) +(ENXIO (groups k Scheme) (scan-data "")) +(EOPNOTSUPP (groups k Scheme) (scan-data "")) +(EOVERFLOW (groups k Scheme) (scan-data "")) +(EPERM (groups k Scheme) (scan-data "")) +(EPFNOSUPPORT (groups k Scheme) (scan-data "")) +(EPIPE (groups k Scheme) (scan-data "")) +(EPROTO (groups k Scheme) (scan-data "")) +(EPROTONOSUPPORT (groups k Scheme) (scan-data "")) +(EPROTOTYPE (groups k Scheme) (scan-data "")) +(ERANGE (groups k Scheme) (scan-data "")) +(EREMCHG (groups k Scheme) (scan-data "")) +(EREMOTE (groups k Scheme) (scan-data "")) +(EREMOTEIO (groups k Scheme) (scan-data "")) +(ERESTART (groups k Scheme) (scan-data "")) +(EROFS (groups k Scheme) (scan-data "")) +(ESHUTDOWN (groups k Scheme) (scan-data "")) +(ESOCKTNOSUPPORT (groups k Scheme) (scan-data "")) +(ESPIPE (groups k Scheme) (scan-data "")) +(ESRCH (groups k Scheme) (scan-data "")) +(ESRMNT (groups k Scheme) (scan-data "")) +(ESTALE (groups k Scheme) (scan-data "")) +(ESTRPIPE (groups k Scheme) (scan-data "")) +(ETIME (groups k Scheme) (scan-data "")) +(ETIMEDOUT (groups k Scheme) (scan-data "")) +(ETOOMANYREFS (groups k Scheme) (scan-data "")) +(ETXTBSY (groups k Scheme) (scan-data "")) +(EUCLEAN (groups k Scheme) (scan-data "")) +(EUNATCH (groups k Scheme) (scan-data "")) +(EUSERS (groups k Scheme) (scan-data "")) +(EWOULDBLOCK (groups k Scheme) (scan-data "")) +(EXDEV (groups k Scheme) (scan-data "")) +(EXFULL (groups k Scheme) (scan-data "")) +(FD_CLOEXEC (groups POSIX k Scheme) (scan-data "")) +(F_DUPFD (groups POSIX k Scheme) (scan-data "")) +(F_GETFD (groups POSIX k Scheme) (scan-data "")) +(F_GETFL (groups POSIX k Scheme) (scan-data "")) +(F_GETOWN (groups POSIX k Scheme) (scan-data "")) +(F_OK (groups POSIX k Scheme) (scan-data "")) +(F_SETFD (groups POSIX k Scheme) (scan-data "")) +(F_SETFL (groups POSIX k Scheme) (scan-data "")) +(F_SETOWN (groups POSIX k Scheme) (scan-data "")) +(INADDR_ANY (groups k Scheme) (scan-data "")) +(INADDR_BROADCAST (groups k Scheme) (scan-data "")) +(INADDR_LOOPBACK (groups k Scheme) (scan-data "")) +(INADDR_NONE (groups k Scheme) (scan-data "")) +(ITIMER_PROF (groups k Scheme) (scan-data "")) +(ITIMER_REAL (groups k Scheme) (scan-data "")) +(ITIMER_VIRTUAL (groups k Scheme) (scan-data "")) +(LC_ALL (groups POSIX k Scheme) (scan-data "")) +(LC_COLLATE (groups POSIX k Scheme) (scan-data "")) +(LC_CTYPE (groups POSIX k Scheme) (scan-data "")) +(LC_MESSAGES (groups POSIX k Scheme) (scan-data "")) +(LC_MONETARY (groups POSIX k Scheme) (scan-data "")) +(LC_NUMERIC (groups POSIX k Scheme) (scan-data "")) +(LC_TIME (groups POSIX k Scheme) (scan-data "")) +(LOCK_EX (groups POSIX k Scheme) (scan-data "")) +(LOCK_NB (groups POSIX k Scheme) (scan-data "")) +(LOCK_SH (groups POSIX k Scheme) (scan-data "")) +(LOCK_UN (groups POSIX k Scheme) (scan-data "")) +(MSG_DONTROUTE (groups k Scheme) (scan-data "")) +(MSG_OOB (groups k Scheme) (scan-data "")) +(MSG_PEEK (groups k Scheme) (scan-data "")) +(NSIG (groups k Scheme) (scan-data "")) +(OPEN_BOTH (groups k Scheme) (scan-data "")) +(OPEN_READ (groups k Scheme) (scan-data "")) +(OPEN_WRITE (groups k Scheme) (scan-data "")) +(O_APPEND (groups POSIX k Scheme) (scan-data "")) +(O_CREAT (groups POSIX k Scheme) (scan-data "")) +(O_EXCL (groups k Scheme) (scan-data "")) +(O_NDELAY (groups k Scheme) (scan-data "")) +(O_NOCTTY (groups k Scheme) (scan-data "")) +(O_NONBLOCK (groups k Scheme) (scan-data "")) +(O_RDONLY (groups POSIX k Scheme) (scan-data "")) +(O_RDWR (groups POSIX k Scheme) (scan-data "")) +(O_SYNC (groups k Scheme) (scan-data "")) +(O_TRUNC (groups k Scheme) (scan-data "")) +(O_WRONLY (groups POSIX k Scheme) (scan-data "")) +(PF_INET (groups k Scheme) (scan-data "")) +(PF_INET6 (groups k Scheme) (scan-data "")) +(PF_UNIX (groups k Scheme) (scan-data "")) +(PF_UNSPEC (groups k Scheme) (scan-data "")) +(PIPE_BUF (groups k Scheme) (scan-data "")) +(PRIO_PGRP (groups k Scheme) (scan-data "")) +(PRIO_PROCESS (groups k Scheme) (scan-data "")) +(PRIO_USER (groups k Scheme) (scan-data "")) +(R_OK (groups POSIX k Scheme) (scan-data "")) +(SA_NOCLDSTOP (groups k Scheme) (scan-data "")) +(SA_RESTART (groups k Scheme) (scan-data "")) +(SEEK_CUR (groups k Scheme) (scan-data "")) +(SEEK_END (groups k Scheme) (scan-data "")) +(SEEK_SET (groups k Scheme) (scan-data "")) +(SIGABRT (groups k Scheme) (scan-data "")) +(SIGALRM (groups k Scheme) (scan-data "")) +(SIGBUS (groups k Scheme) (scan-data "")) +(SIGCHLD (groups k Scheme) (scan-data "")) +(SIGCLD (groups k Scheme) (scan-data "")) +(SIGCONT (groups k Scheme) (scan-data "")) +(SIGFPE (groups k Scheme) (scan-data "")) +(SIGHUP (groups POSIX k Scheme) (scan-data "")) +(SIGILL (groups k Scheme) (scan-data "")) +(SIGINT (groups POSIX k Scheme) (scan-data "")) +(SIGIO (groups k Scheme) (scan-data "")) +(SIGIOT (groups k Scheme) (scan-data "")) +(SIGKILL (groups k Scheme) (scan-data "")) +(SIGPIPE (groups k Scheme) (scan-data "")) +(SIGPOLL (groups k Scheme) (scan-data "")) +(SIGPROF (groups k Scheme) (scan-data "")) +(SIGPWR (groups k Scheme) (scan-data "")) +(SIGQUIT (groups k Scheme) (scan-data "")) +(SIGSEGV (groups k Scheme) (scan-data "")) +(SIGSTKFLT (groups k Scheme) (scan-data "")) +(SIGSTOP (groups k Scheme) (scan-data "")) +(SIGTERM (groups k Scheme) (scan-data "")) +(SIGTRAP (groups k Scheme) (scan-data "")) +(SIGTSTP (groups k Scheme) (scan-data "")) +(SIGTTIN (groups k Scheme) (scan-data "")) +(SIGTTOU (groups k Scheme) (scan-data "")) +(SIGUNUSED (groups k Scheme) (scan-data "")) +(SIGURG (groups k Scheme) (scan-data "")) +(SIGUSR1 (groups k Scheme) (scan-data "")) +(SIGUSR2 (groups k Scheme) (scan-data "")) +(SIGVTALRM (groups k Scheme) (scan-data "")) +(SIGWINCH (groups k Scheme) (scan-data "")) +(SIGXCPU (groups k Scheme) (scan-data "")) +(SIGXFSZ (groups k Scheme) (scan-data "")) +(SIG_DFL (groups k Scheme) (scan-data "")) +(SIG_IGN (groups k Scheme) (scan-data "")) +(SOCK_DGRAM (groups k Scheme) (scan-data "")) +(SOCK_RAW (groups k Scheme) (scan-data "")) +(SOCK_STREAM (groups k Scheme) (scan-data "")) +(SOL_IP (groups k Scheme) (scan-data "")) +(SOL_SOCKET (groups k Scheme) (scan-data "")) +(SO_BROADCAST (groups k Scheme) (scan-data "")) +(SO_DEBUG (groups k Scheme) (scan-data "")) +(SO_DONTROUTE (groups k Scheme) (scan-data "")) +(SO_ERROR (groups k Scheme) (scan-data "")) +(SO_KEEPALIVE (groups k Scheme) (scan-data "")) +(SO_LINGER (groups k Scheme) (scan-data "")) +(SO_NO_CHECK (groups k Scheme) (scan-data "")) +(SO_OOBINLINE (groups k Scheme) (scan-data "")) +(SO_PRIORITY (groups k Scheme) (scan-data "")) +(SO_RCVBUF (groups k Scheme) (scan-data "")) +(SO_REUSEADDR (groups k Scheme) (scan-data "")) +(SO_SNDBUF (groups k Scheme) (scan-data "")) +(SO_TYPE (groups k Scheme) (scan-data "")) +(WAIT_ANY (groups k Scheme) (scan-data "")) +(WAIT_MYPGRP (groups k Scheme) (scan-data "")) +(WNOHANG (groups POSIX k Scheme) (scan-data "")) +(WUNTRACED (groups POSIX k Scheme) (scan-data "")) +(W_OK (groups POSIX k Scheme) (scan-data "")) +(X_OK (groups POSIX k Scheme) (scan-data "")) +(_IOFBF (groups POSIX k Scheme) (scan-data "")) +(_IOLBF (groups POSIX k Scheme) (scan-data "")) +(_IONBF (groups POSIX k Scheme) (scan-data "")) +(_fini (groups C) (scan-data T)) +(_init (groups C) (scan-data T)) +(abort-hook (groups Scheme) (scan-data "")) +(abs (groups Scheme) (scan-data "#")) +(accept (groups Scheme) (scan-data "#")) +(access? (groups POSIX Scheme) (scan-data "#")) +(acons (groups Scheme) (scan-data "#")) +(acos (groups Scheme) (scan-data "#")) +(acosh (groups Scheme) (scan-data "#")) +(add-hook! (groups Scheme) (scan-data "#")) +(after-backtrace-hook (groups Scheme) (scan-data "")) +(after-error-hook (groups Scheme) (scan-data "")) +(after-eval-hook (groups Scheme) (scan-data "")) +(after-gc-hook (groups Scheme) (scan-data "")) +(after-print-hook (groups Scheme) (scan-data "")) +(after-read-hook (groups Scheme) (scan-data "")) +(alarm (groups POSIX Scheme) (scan-data "#")) +(and (groups Scheme) (scan-data "")) +(and-map (groups Scheme) (scan-data "#")) +(and=> (groups Scheme) (scan-data "# (value procedure)>")) +(angle (groups Scheme) (scan-data "#")) +(app (groups Scheme) (scan-data "")) +(append (groups Scheme) (scan-data "#")) +(append! (groups Scheme) (scan-data "#")) +(apply (groups Scheme) (scan-data "#")) +(apply-to-args (groups Scheme) (scan-data "#")) +(apply:nconc2last (groups Scheme) (scan-data "#")) +(array->list (groups Scheme) (scan-data "#list>")) +(array-contents (groups Scheme) (scan-data "#")) +(array-copy! (groups Scheme) (scan-data "#")) +(array-copy-in-order! (groups Scheme) (scan-data "#")) +(array-dimensions (groups Scheme) (scan-data "#")) +(array-equal? (groups Scheme) (scan-data "#")) +(array-fill! (groups Scheme) (scan-data "#")) +(array-for-each (groups Scheme) (scan-data "#")) +(array-in-bounds? (groups Scheme) (scan-data "#")) +(array-index-map! (groups Scheme) (scan-data "#")) +(array-map! (groups Scheme) (scan-data "#")) +(array-map-in-order! (groups Scheme) (scan-data "#")) +(array-prototype (groups Scheme) (scan-data "#")) +(array-rank (groups Scheme) (scan-data "#")) +(array-ref (groups Scheme) (scan-data "#")) +(array-set! (groups Scheme) (scan-data "#")) +(array-shape (groups Scheme) (scan-data "#")) +(array? (groups Scheme) (scan-data "#")) +(ash (groups Scheme) (scan-data "#")) +(asin (groups Scheme) (scan-data "#")) +(asinh (groups Scheme) (scan-data "#")) +(assert-defmacro?! (groups Scheme) (scan-data "#")) +(assert-load-verbosity (groups Scheme) (scan-data "#")) +(assert-repl-print-unspecified (groups Scheme) (scan-data "#")) +(assert-repl-silence (groups Scheme) (scan-data "#")) +(assert-repl-verbosity (groups Scheme) (scan-data "#")) +(assoc (groups Scheme) (scan-data "#")) +(assoc-ref (groups Scheme) (scan-data "#")) +(assoc-remove! (groups Scheme) (scan-data "#")) +(assoc-set! (groups Scheme) (scan-data "#")) +(assq (groups Scheme) (scan-data "#")) +(assq-ref (groups Scheme) (scan-data "#")) +(assq-remove! (groups Scheme) (scan-data "#")) +(assq-set! (groups Scheme) (scan-data "#")) +(assv (groups Scheme) (scan-data "#")) +(assv-ref (groups Scheme) (scan-data "#")) +(assv-remove! (groups Scheme) (scan-data "#")) +(assv-set! (groups Scheme) (scan-data "#")) +(async (groups Scheme) (scan-data "#")) +(async-mark (groups Scheme) (scan-data "#")) +(atan (groups Scheme) (scan-data "#")) +(atanh (groups Scheme) (scan-data "#")) +(autoload-done! (groups Scheme) (scan-data "#")) +(autoload-done-or-in-progress? (groups Scheme) (scan-data "#")) +(autoload-in-progress! (groups Scheme) (scan-data "#")) +(autoloads-done (groups Scheme) (scan-data "")) +(autoloads-in-progress (groups Scheme) (scan-data "")) +(backtrace (groups Scheme) (scan-data "#")) +(bad-throw (groups Scheme) (scan-data "#")) +(basename (groups POSIX Scheme) (scan-data "#")) +(basic-load (groups Scheme) (scan-data "#")) +(batch-mode? (groups Scheme) (scan-data "#")) +(beautify-user-module! (groups Scheme) (scan-data "#")) +(before-backtrace-hook (groups Scheme) (scan-data "")) +(before-error-hook (groups Scheme) (scan-data "")) +(before-eval-hook (groups Scheme) (scan-data "")) +(before-print-hook (groups Scheme) (scan-data "")) +(before-read-hook (groups Scheme) (scan-data "")) +(before-signal-stack (groups Scheme) (scan-data "")) +(begin (groups Scheme) (scan-data "")) +(begin-deprecated (groups Scheme) (scan-data "")) +(bind (groups Scheme) (scan-data "#")) +(bit-count (groups Scheme) (scan-data "#")) +(bit-count* (groups Scheme) (scan-data "#")) +(bit-extract (groups Scheme) (scan-data "#")) +(bit-invert! (groups Scheme) (scan-data "#")) +(bit-position (groups Scheme) (scan-data "#")) +(bit-set*! (groups Scheme) (scan-data "#")) +(boolean? (groups Scheme) (scan-data "#")) +(caaaar (groups Scheme) (scan-data "#")) +(caaadr (groups Scheme) (scan-data "#")) +(caaar (groups Scheme) (scan-data "#")) +(caadar (groups Scheme) (scan-data "#")) +(caaddr (groups Scheme) (scan-data "#")) +(caadr (groups Scheme) (scan-data "#")) +(caar (groups Scheme) (scan-data "#")) +(cadaar (groups Scheme) (scan-data "#")) +(cadadr (groups Scheme) (scan-data "#")) +(cadar (groups Scheme) (scan-data "#")) +(caddar (groups Scheme) (scan-data "#")) +(cadddr (groups Scheme) (scan-data "#")) +(caddr (groups Scheme) (scan-data "#")) +(cadr (groups Scheme) (scan-data "#")) +(call-with-current-continuation (groups Scheme) (scan-data "#")) +(call-with-dynamic-root (groups Scheme) (scan-data "#")) +(call-with-input-file (groups Scheme) (scan-data "#")) +(call-with-input-string (groups Scheme) (scan-data "#")) +(call-with-new-thread (groups Scheme) (scan-data "#")) +(call-with-output-file (groups Scheme) (scan-data "#")) +(call-with-output-string (groups Scheme) (scan-data "#")) +(call-with-values (groups Scheme) (scan-data "#")) +(car (groups Scheme) (scan-data "#")) +(case (groups Scheme) (scan-data "")) +(catch (groups Scheme) (scan-data "#")) +(cdaaar (groups Scheme) (scan-data "#")) +(cdaadr (groups Scheme) (scan-data "#")) +(cdaar (groups Scheme) (scan-data "#")) +(cdadar (groups Scheme) (scan-data "#")) +(cdaddr (groups Scheme) (scan-data "#")) +(cdadr (groups Scheme) (scan-data "#")) +(cdar (groups Scheme) (scan-data "#")) +(cddaar (groups Scheme) (scan-data "#")) +(cddadr (groups Scheme) (scan-data "#")) +(cddar (groups Scheme) (scan-data "#")) +(cdddar (groups Scheme) (scan-data "#")) +(cddddr (groups Scheme) (scan-data "#")) +(cdddr (groups Scheme) (scan-data "#")) +(cddr (groups Scheme) (scan-data "#")) +(cdr (groups Scheme) (scan-data "#")) +(ceiling (groups Scheme) (scan-data "#")) +(char->integer (groups Scheme) (scan-data "#integer>")) +(char-alphabetic? (groups Scheme) (scan-data "#")) +(char-ci<=? (groups Scheme) (scan-data "#")) +(char-ci")) +(char-ci=? (groups Scheme) (scan-data "#")) +(char-ci>=? (groups Scheme) (scan-data "#=?>")) +(char-ci>? (groups Scheme) (scan-data "#?>")) +(char-code-limit (groups Scheme) (scan-data "")) +(char-downcase (groups Scheme) (scan-data "#")) +(char-is-both? (groups Scheme) (scan-data "#")) +(char-lower-case? (groups Scheme) (scan-data "#")) +(char-numeric? (groups Scheme) (scan-data "#")) +(char-ready? (groups Scheme) (scan-data "#")) +(char-upcase (groups Scheme) (scan-data "#")) +(char-upper-case? (groups Scheme) (scan-data "#")) +(char-whitespace? (groups Scheme) (scan-data "#")) +(char<=? (groups Scheme) (scan-data "#")) +(char")) +(char=? (groups Scheme) (scan-data "#")) +(char>=? (groups Scheme) (scan-data "#=?>")) +(char>? (groups Scheme) (scan-data "#?>")) +(char? (groups Scheme) (scan-data "#")) +(chdir (groups POSIX Scheme) (scan-data "#")) +(chmod (groups POSIX Scheme) (scan-data "#")) +(chown (groups POSIX Scheme) (scan-data "#")) +(chroot (groups POSIX Scheme) (scan-data "#")) +(class-of (groups Scheme) (scan-data "#")) +(close (groups POSIX Scheme) (scan-data "#")) +(close-fdes (groups POSIX Scheme) (scan-data "#")) +(close-input-port (groups Scheme) (scan-data "#")) +(close-io-port (groups Scheme) (scan-data "#")) +(close-output-port (groups Scheme) (scan-data "#")) +(close-port (groups Scheme) (scan-data "#")) +(closedir (groups POSIX Scheme) (scan-data "#")) +(closure? (groups Scheme) (scan-data "#")) +(collect (groups Scheme) (scan-data "")) +(command-line (groups POSIX Scheme) (scan-data "#")) +(compile-define-module-args (groups Scheme) (scan-data "#")) +(compile-interface-spec (groups Scheme) (scan-data "#")) +(complex? (groups Scheme) (scan-data "#")) +(cond (groups Scheme) (scan-data "")) +(cond-expand (groups Scheme) (scan-data "")) +(cond-expand-provide (groups Scheme) (scan-data "#")) +(connect (groups Scheme) (scan-data "#")) +(cons (groups Scheme) (scan-data "#")) +(cons* (groups Scheme) (scan-data "#")) +(cons-source (groups Scheme) (scan-data "#")) +(coop_abort (groups guile-C-API coop C) (scan-data T)) +(coop_condition_variable_destroy (groups guile-C-API coop C) (scan-data T)) +(coop_condition_variable_init (groups guile-C-API coop C) (scan-data T)) +(coop_condition_variable_signal (groups guile-C-API coop C) (scan-data T)) +(coop_condition_variable_timed_wait_mutex (groups guile-C-API coop C) (scan-data T)) +(coop_condition_variable_wait_mutex (groups guile-C-API coop C) (scan-data T)) +(coop_create (groups guile-C-API coop C) (scan-data T)) +(coop_getspecific (groups guile-C-API coop C) (scan-data T)) +(coop_global_allq (groups guile-C-API coop C) (scan-data B)) +(coop_global_curr (groups guile-C-API coop C) (scan-data B)) +(coop_global_runq (groups guile-C-API coop C) (scan-data B)) +(coop_global_sleepq (groups guile-C-API coop C) (scan-data B)) +(coop_init (groups guile-C-API coop C) (scan-data T)) +(coop_join (groups guile-C-API coop C) (scan-data T)) +(coop_key_create (groups guile-C-API coop C) (scan-data T)) +(coop_key_delete (groups guile-C-API coop C) (scan-data T)) +(coop_mutex_destroy (groups guile-C-API coop C) (scan-data T)) +(coop_mutex_init (groups guile-C-API coop C) (scan-data T)) +(coop_mutex_lock (groups guile-C-API coop C) (scan-data T)) +(coop_mutex_trylock (groups guile-C-API coop C) (scan-data T)) +(coop_mutex_unlock (groups guile-C-API coop C) (scan-data T)) +(coop_new_condition_variable_init (groups guile-C-API coop C) (scan-data T)) +(coop_new_mutex_init (groups guile-C-API coop C) (scan-data T)) +(coop_next_runnable_thread (groups guile-C-API coop C) (scan-data T)) +(coop_qget (groups guile-C-API coop C) (scan-data T)) +(coop_qput (groups guile-C-API coop C) (scan-data T)) +(coop_setspecific (groups guile-C-API coop C) (scan-data T)) +(coop_sleephelp (groups guile-C-API coop C) (scan-data T)) +(coop_start (groups guile-C-API coop C) (scan-data T)) +(coop_timeout_qinsert (groups guile-C-API coop C) (scan-data T)) +(coop_tmp_queue (groups guile-C-API coop C) (scan-data B)) +(coop_wait_for_runnable_thread (groups guile-C-API coop C) (scan-data T)) +(coop_wait_for_runnable_thread_now (groups guile-C-API coop C) (scan-data T)) +(coop_yield (groups guile-C-API coop C) (scan-data T)) +(copy-file (groups POSIX Scheme) (scan-data "#")) +(copy-random-state (groups Scheme) (scan-data "#")) +(copy-tree (groups Scheme) (scan-data "#")) +(cos (groups Scheme) (scan-data "#")) +(cosh (groups Scheme) (scan-data "#")) +(crypt (groups POSIX Scheme) (scan-data "#")) +(ctermid (groups POSIX Scheme) (scan-data "#")) +(current-error-port (groups Scheme) (scan-data "#")) +(current-input-port (groups Scheme) (scan-data "#")) +(current-load-port (groups Scheme) (scan-data "#")) +(current-module (groups Scheme) (scan-data "#")) +(current-output-port (groups Scheme) (scan-data "#")) +(current-time (groups POSIX Scheme) (scan-data "#")) +(cuserid (groups POSIX Scheme) (scan-data "#")) +(debug-disable (groups Scheme) (scan-data "#")) +(debug-enable (groups Scheme) (scan-data "#")) +(debug-object? (groups Scheme) (scan-data "#")) +(debug-options (groups Scheme) (scan-data "#")) +(debug-options-interface (groups Scheme) (scan-data "#")) +(debug-set! (groups Scheme) (scan-data "")) +(default-lazy-handler (groups Scheme) (scan-data "#")) +(define (groups Scheme) (scan-data "")) +(define-macro (groups Scheme) (scan-data "")) +(define-module (groups Scheme) (scan-data "")) +(define-option-interface (groups Scheme) (scan-data "")) +(define-private (groups Scheme) (scan-data "")) +(define-public (groups Scheme) (scan-data "")) +(define-syntax-macro (groups Scheme) (scan-data "")) +(defined? (groups Scheme) (scan-data "#")) +(defmacro (groups Scheme) (scan-data "")) +(defmacro-public (groups Scheme) (scan-data "")) +(defmacro-transformer (groups Scheme) (scan-data "#")) +(defmacro:syntax-transformer (groups Scheme) (scan-data "#")) +(defmacro:transformer (groups Scheme) (scan-data "#")) +(defmacro? (groups Scheme) (scan-data "#")) +(delay (groups Scheme) (scan-data "")) +(delete (groups Scheme) (scan-data "#")) +(delete! (groups Scheme) (scan-data "#")) +(delete-file (groups POSIX Scheme) (scan-data "#")) +(delete1! (groups Scheme) (scan-data "#")) +(delq (groups Scheme) (scan-data "#")) +(delq! (groups Scheme) (scan-data "#")) +(delq1! (groups Scheme) (scan-data "#")) +(delv (groups Scheme) (scan-data "#")) +(delv! (groups Scheme) (scan-data "#")) +(delv1! (groups Scheme) (scan-data "#")) +(destroy-guardian! (groups Scheme) (scan-data "#")) +(dimensions->uniform-array (groups Scheme) (scan-data "#uniform-array>")) +(directory-stream? (groups POSIX Scheme) (scan-data "#")) +(dirname (groups POSIX Scheme) (scan-data "#")) +(display (groups Scheme) (scan-data "#")) +(display-application (groups Scheme) (scan-data "#")) +(display-backtrace (groups Scheme) (scan-data "#")) +(display-error (groups Scheme) (scan-data "#")) +(display-usage-report (groups Scheme) (scan-data "#")) +(do (groups Scheme) (scan-data "")) +(doubly-weak-hash-table? (groups Scheme) (scan-data "#")) +(drain-input (groups Scheme) (scan-data "#")) +(dup (groups POSIX Scheme) (scan-data "#")) +(dup->fdes (groups POSIX Scheme) (scan-data "#fdes>")) +(dup->inport (groups POSIX Scheme) (scan-data "#inport (port/fd . maybe-fd)>")) +(dup->outport (groups POSIX Scheme) (scan-data "#outport (port/fd . maybe-fd)>")) +(dup->port (groups POSIX Scheme) (scan-data "#port (port/fd mode . maybe-fd)>")) +(dup2 (groups POSIX Scheme) (scan-data "#")) +(duplicate-port (groups POSIX Scheme) (scan-data "#")) +(dynamic-args-call (groups Scheme) (scan-data "#")) +(dynamic-call (groups Scheme) (scan-data "#")) +(dynamic-func (groups Scheme) (scan-data "#")) +(dynamic-link (groups Scheme) (scan-data "#")) +(dynamic-object? (groups Scheme) (scan-data "#")) +(dynamic-root (groups Scheme) (scan-data "#")) +(dynamic-unlink (groups Scheme) (scan-data "#")) +(dynamic-wind (groups Scheme) (scan-data "#")) +(enclose-array (groups Scheme) (scan-data "#")) +(endgrent (groups POSIX Scheme) (scan-data "#")) +(endhostent (groups Scheme) (scan-data "#")) +(endnetent (groups Scheme) (scan-data "#")) +(endprotoent (groups Scheme) (scan-data "#")) +(endpwent (groups POSIX Scheme) (scan-data "#")) +(endservent (groups Scheme) (scan-data "#")) +(entity? (groups Scheme) (scan-data "#")) +(env-module (groups Scheme) (scan-data "#")) +(environ (groups POSIX Scheme) (scan-data "#")) +(environment-bound? (groups Scheme) (scan-data "#")) +(environment-cell (groups Scheme) (scan-data "#")) +(environment-define (groups Scheme) (scan-data "#")) +(environment-fold (groups Scheme) (scan-data "#")) +(environment-module (groups Scheme) (scan-data "#")) +(environment-observe (groups Scheme) (scan-data "#")) +(environment-observe-weak (groups Scheme) (scan-data "#")) +(environment-ref (groups Scheme) (scan-data "#")) +(environment-set! (groups Scheme) (scan-data "#")) +(environment-undefine (groups Scheme) (scan-data "#")) +(environment-unobserve (groups Scheme) (scan-data "#")) +(environment? (groups Scheme) (scan-data "#")) +(eof-object? (groups Scheme) (scan-data "#")) +(eq? (groups Scheme) (scan-data "#")) +(equal? (groups Scheme) (scan-data "#")) +(eqv? (groups Scheme) (scan-data "#")) +(error (groups Scheme) (scan-data "#")) +(error-catching-loop (groups Scheme) (scan-data "#")) +(error-catching-repl (groups Scheme) (scan-data "#")) +(eval (groups Scheme) (scan-data "#")) +(eval-case (groups Scheme) (scan-data "")) +(eval-disable (groups Scheme) (scan-data "#")) +(eval-enable (groups Scheme) (scan-data "#")) +(eval-environment-imported (groups Scheme) (scan-data "#")) +(eval-environment-local (groups Scheme) (scan-data "#")) +(eval-environment-set-imported! (groups Scheme) (scan-data "#")) +(eval-environment-set-local! (groups Scheme) (scan-data "#")) +(eval-environment? (groups Scheme) (scan-data "#")) +(eval-options (groups Scheme) (scan-data "#")) +(eval-options-interface (groups Scheme) (scan-data "#")) +(eval-set! (groups Scheme) (scan-data "")) +(eval-string (groups Scheme) (scan-data "#")) +(evaluator-traps-interface (groups Scheme) (scan-data "#")) +(even? (groups Scheme) (scan-data "#")) +(exact->inexact (groups Scheme) (scan-data "#inexact>")) +(exact? (groups Scheme) (scan-data "#")) +(execl (groups POSIX Scheme) (scan-data "#")) +(execle (groups POSIX Scheme) (scan-data "#")) +(execlp (groups POSIX Scheme) (scan-data "#")) +(exit (groups Scheme) (scan-data "#")) +(exit-hook (groups Scheme) (scan-data "")) +(exp (groups Scheme) (scan-data "#")) +(export (groups Scheme) (scan-data "")) +(export-environment-private (groups Scheme) (scan-data "#")) +(export-environment-set-private! (groups Scheme) (scan-data "#")) +(export-environment-set-signature! (groups Scheme) (scan-data "#")) +(export-environment-signature (groups Scheme) (scan-data "#")) +(export-environment? (groups Scheme) (scan-data "#")) +(export-syntax (groups Scheme) (scan-data "")) +(expt (groups Scheme) (scan-data "#")) +(false-if-exception (groups Scheme) (scan-data "")) +(fcntl (groups POSIX Scheme) (scan-data "#")) +(fdes->inport (groups POSIX Scheme) (scan-data "#inport (fdes)>")) +(fdes->outport (groups POSIX Scheme) (scan-data "#outport (fdes)>")) +(fdes->ports (groups POSIX Scheme) (scan-data "#ports>")) +(fdopen (groups POSIX Scheme) (scan-data "#")) +(feature? (groups Scheme) (scan-data "#")) +(file-exists? (groups Scheme) (scan-data "#")) +(file-is-directory? (groups Scheme) (scan-data "#")) +(file-port? (groups Scheme) (scan-data "#")) +(file-position (groups Scheme) (scan-data "#")) +(file-set-position (groups Scheme) (scan-data "#")) +(fileno (groups POSIX Scheme) (scan-data "#")) +(flock (groups POSIX Scheme) (scan-data "#")) +(floor (groups Scheme) (scan-data "#")) +(fluid-ref (groups Scheme) (scan-data "#")) +(fluid-set! (groups Scheme) (scan-data "#")) +(fluid? (groups Scheme) (scan-data "#")) +(flush-all-ports (groups Scheme) (scan-data "#")) +(for-each (groups Scheme) (scan-data "#")) +(for-next-option (groups Scheme) (scan-data "#")) +(force (groups Scheme) (scan-data "#")) +(force-output (groups Scheme) (scan-data "#")) +(format (groups Scheme) (scan-data "#")) +(frame-arguments (groups Scheme) (scan-data "#")) +(frame-evaluating-args? (groups Scheme) (scan-data "#")) +(frame-next (groups Scheme) (scan-data "#")) +(frame-number (groups Scheme) (scan-data "#")) +(frame-overflow? (groups Scheme) (scan-data "#")) +(frame-previous (groups Scheme) (scan-data "#")) +(frame-procedure (groups Scheme) (scan-data "#")) +(frame-procedure? (groups Scheme) (scan-data "#")) +(frame-real? (groups Scheme) (scan-data "#")) +(frame-source (groups Scheme) (scan-data "#")) +(frame? (groups Scheme) (scan-data "#")) +(fsync (groups POSIX Scheme) (scan-data "#")) +(ftell (groups Scheme) (scan-data "#")) +(gc (groups Scheme) (scan-data "#")) +(gc-run-time (groups Scheme) (scan-data "#")) +(gc-stats (groups Scheme) (scan-data "#")) +(gcd (groups Scheme) (scan-data "#")) +(gdb_binding (groups guile-C-API gdb C) (scan-data T)) +(gdb_eval (groups guile-C-API gdb C) (scan-data T)) +(gdb_language (groups guile-C-API gdb C) (scan-data D)) +(gdb_maybe_valid_type_p (groups guile-C-API gdb C) (scan-data T)) +(gdb_options (groups guile-C-API gdb C) (scan-data D)) +(gdb_output (groups guile-C-API gdb C) (scan-data B)) +(gdb_output_length (groups guile-C-API gdb C) (scan-data B)) +(gdb_print (groups guile-C-API gdb C) (scan-data T)) +(gdb_read (groups guile-C-API gdb C) (scan-data T)) +(gdb_result (groups guile-C-API gdb C) (scan-data B)) +(gensym (groups Scheme) (scan-data "#")) +(get-internal-real-time (groups POSIX Scheme) (scan-data "#")) +(get-internal-run-time (groups POSIX Scheme) (scan-data "#")) +(get-option (groups Scheme) (scan-data "#")) +(get-output-string (groups Scheme) (scan-data "#")) +(get-print-state (groups Scheme) (scan-data "#")) +(getcwd (groups POSIX Scheme) (scan-data "#")) +(getegid (groups POSIX Scheme) (scan-data "#")) +(getenv (groups POSIX Scheme) (scan-data "#")) +(geteuid (groups POSIX Scheme) (scan-data "#")) +(getgid (groups POSIX Scheme) (scan-data "#")) +(getgr (groups POSIX Scheme) (scan-data "#")) +(getgrent (groups POSIX Scheme) (scan-data "#")) +(getgrgid (groups POSIX Scheme) (scan-data "#")) +(getgrnam (groups POSIX Scheme) (scan-data "#")) +(getgroups (groups POSIX Scheme) (scan-data "#")) +(gethost (groups Scheme) (scan-data "#")) +(gethostbyaddr (groups Scheme) (scan-data "#")) +(gethostbyname (groups Scheme) (scan-data "#")) +(gethostent (groups Scheme) (scan-data "#")) +(gethostname (groups POSIX Scheme) (scan-data "#")) +(getitimer (groups POSIX Scheme) (scan-data "#")) +(getlogin (groups POSIX Scheme) (scan-data "#")) +(getnet (groups Scheme) (scan-data "#")) +(getnetbyaddr (groups Scheme) (scan-data "#")) +(getnetbyname (groups Scheme) (scan-data "#")) +(getnetent (groups Scheme) (scan-data "#")) +(getpass (groups POSIX Scheme) (scan-data "#")) +(getpeername (groups Scheme) (scan-data "#")) +(getpgrp (groups POSIX Scheme) (scan-data "#")) +(getpid (groups POSIX Scheme) (scan-data "#")) +(getppid (groups POSIX Scheme) (scan-data "#")) +(getpriority (groups POSIX Scheme) (scan-data "#")) +(getproto (groups Scheme) (scan-data "#")) +(getprotobyname (groups Scheme) (scan-data "#")) +(getprotobynumber (groups Scheme) (scan-data "#")) +(getprotoent (groups Scheme) (scan-data "#")) +(getpw (groups POSIX Scheme) (scan-data "#")) +(getpwent (groups POSIX Scheme) (scan-data "#")) +(getpwnam (groups POSIX Scheme) (scan-data "#")) +(getpwuid (groups POSIX Scheme) (scan-data "#")) +(getserv (groups Scheme) (scan-data "#")) +(getservbyname (groups Scheme) (scan-data "#")) +(getservbyport (groups Scheme) (scan-data "#")) +(getservent (groups Scheme) (scan-data "#")) +(getsockname (groups Scheme) (scan-data "#")) +(getsockopt (groups Scheme) (scan-data "#")) +(gettimeofday (groups POSIX Scheme) (scan-data "#")) +(getuid (groups POSIX Scheme) (scan-data "#")) +(gh_append (groups guile-C-API gh C) (scan-data T)) +(gh_append2 (groups guile-C-API gh C) (scan-data T)) +(gh_append3 (groups guile-C-API gh C) (scan-data T)) +(gh_append4 (groups guile-C-API gh C) (scan-data T)) +(gh_apply (groups guile-C-API gh C) (scan-data T)) +(gh_bool2scm (groups guile-C-API gh C) (scan-data T)) +(gh_boolean_p (groups guile-C-API gh C) (scan-data T)) +(gh_caaar (groups guile-C-API gh C) (scan-data T)) +(gh_caadr (groups guile-C-API gh C) (scan-data T)) +(gh_caar (groups guile-C-API gh C) (scan-data T)) +(gh_cadar (groups guile-C-API gh C) (scan-data T)) +(gh_caddr (groups guile-C-API gh C) (scan-data T)) +(gh_cadr (groups guile-C-API gh C) (scan-data T)) +(gh_call0 (groups guile-C-API gh C) (scan-data T)) +(gh_call1 (groups guile-C-API gh C) (scan-data T)) +(gh_call2 (groups guile-C-API gh C) (scan-data T)) +(gh_call3 (groups guile-C-API gh C) (scan-data T)) +(gh_car (groups guile-C-API gh C) (scan-data T)) +(gh_catch (groups guile-C-API gh C) (scan-data T)) +(gh_cdaar (groups guile-C-API gh C) (scan-data T)) +(gh_cdadr (groups guile-C-API gh C) (scan-data T)) +(gh_cdar (groups guile-C-API gh C) (scan-data T)) +(gh_cddar (groups guile-C-API gh C) (scan-data T)) +(gh_cdddr (groups guile-C-API gh C) (scan-data T)) +(gh_cddr (groups guile-C-API gh C) (scan-data T)) +(gh_cdr (groups guile-C-API gh C) (scan-data T)) +(gh_char2scm (groups guile-C-API gh C) (scan-data T)) +(gh_char_p (groups guile-C-API gh C) (scan-data T)) +(gh_chars2byvect (groups guile-C-API gh C) (scan-data T)) +(gh_cons (groups guile-C-API gh C) (scan-data T)) +(gh_define (groups guile-C-API gh C) (scan-data T)) +(gh_display (groups guile-C-API gh C) (scan-data T)) +(gh_double2scm (groups guile-C-API gh C) (scan-data T)) +(gh_doubles2dvect (groups guile-C-API gh C) (scan-data T)) +(gh_doubles2scm (groups guile-C-API gh C) (scan-data T)) +(gh_enter (groups guile-C-API gh C) (scan-data T)) +(gh_eq_p (groups guile-C-API gh C) (scan-data T)) +(gh_equal_p (groups guile-C-API gh C) (scan-data T)) +(gh_eqv_p (groups guile-C-API gh C) (scan-data T)) +(gh_eval_file (groups guile-C-API gh C) (scan-data T)) +(gh_eval_file_with_catch (groups guile-C-API gh C) (scan-data T)) +(gh_eval_file_with_standard_handler (groups guile-C-API gh C) (scan-data T)) +(gh_eval_str (groups guile-C-API gh C) (scan-data T)) +(gh_eval_str_with_catch (groups guile-C-API gh C) (scan-data T)) +(gh_eval_str_with_stack_saving_handler (groups guile-C-API gh C) (scan-data T)) +(gh_eval_str_with_standard_handler (groups guile-C-API gh C) (scan-data T)) +(gh_exact_p (groups guile-C-API gh C) (scan-data T)) +(gh_floats2fvect (groups guile-C-API gh C) (scan-data T)) +(gh_get_substr (groups guile-C-API gh C) (scan-data T)) +(gh_inexact_p (groups guile-C-API gh C) (scan-data T)) +(gh_int2scm (groups guile-C-API gh C) (scan-data T)) +(gh_ints2scm (groups guile-C-API gh C) (scan-data T)) +(gh_length (groups guile-C-API gh C) (scan-data T)) +(gh_list_p (groups guile-C-API gh C) (scan-data T)) +(gh_long2scm (groups guile-C-API gh C) (scan-data T)) +(gh_longs2ivect (groups guile-C-API gh C) (scan-data T)) +(gh_lookup (groups guile-C-API gh C) (scan-data T)) +(gh_make_vector (groups guile-C-API gh C) (scan-data T)) +(gh_module_lookup (groups guile-C-API gh C) (scan-data T)) +(gh_new_procedure (groups guile-C-API gh C) (scan-data T)) +(gh_new_procedure0_0 (groups guile-C-API gh C) (scan-data T)) +(gh_new_procedure0_1 (groups guile-C-API gh C) (scan-data T)) +(gh_new_procedure0_2 (groups guile-C-API gh C) (scan-data T)) +(gh_new_procedure1_0 (groups guile-C-API gh C) (scan-data T)) +(gh_new_procedure1_1 (groups guile-C-API gh C) (scan-data T)) +(gh_new_procedure1_2 (groups guile-C-API gh C) (scan-data T)) +(gh_new_procedure2_0 (groups guile-C-API gh C) (scan-data T)) +(gh_new_procedure2_1 (groups guile-C-API gh C) (scan-data T)) +(gh_new_procedure2_2 (groups guile-C-API gh C) (scan-data T)) +(gh_new_procedure3_0 (groups guile-C-API gh C) (scan-data T)) +(gh_new_procedure4_0 (groups guile-C-API gh C) (scan-data T)) +(gh_new_procedure5_0 (groups guile-C-API gh C) (scan-data T)) +(gh_newline (groups guile-C-API gh C) (scan-data T)) +(gh_null_p (groups guile-C-API gh C) (scan-data T)) +(gh_number_p (groups guile-C-API gh C) (scan-data T)) +(gh_pair_p (groups guile-C-API gh C) (scan-data T)) +(gh_procedure_p (groups guile-C-API gh C) (scan-data T)) +(gh_repl (groups guile-C-API gh C) (scan-data T)) +(gh_scm2bool (groups guile-C-API gh C) (scan-data T)) +(gh_scm2char (groups guile-C-API gh C) (scan-data T)) +(gh_scm2chars (groups guile-C-API gh C) (scan-data T)) +(gh_scm2double (groups guile-C-API gh C) (scan-data T)) +(gh_scm2doubles (groups guile-C-API gh C) (scan-data T)) +(gh_scm2floats (groups guile-C-API gh C) (scan-data T)) +(gh_scm2int (groups guile-C-API gh C) (scan-data T)) +(gh_scm2long (groups guile-C-API gh C) (scan-data T)) +(gh_scm2longs (groups guile-C-API gh C) (scan-data T)) +(gh_scm2newstr (groups guile-C-API gh C) (scan-data T)) +(gh_scm2shorts (groups guile-C-API gh C) (scan-data T)) +(gh_scm2ulong (groups guile-C-API gh C) (scan-data T)) +(gh_set_car_x (groups guile-C-API gh C) (scan-data T)) +(gh_set_cdr_x (groups guile-C-API gh C) (scan-data T)) +(gh_set_substr (groups guile-C-API gh C) (scan-data T)) +(gh_shorts2svect (groups guile-C-API gh C) (scan-data T)) +(gh_standard_handler (groups guile-C-API gh C) (scan-data T)) +(gh_str02scm (groups guile-C-API gh C) (scan-data T)) +(gh_str2scm (groups guile-C-API gh C) (scan-data T)) +(gh_string_equal_p (groups guile-C-API gh C) (scan-data T)) +(gh_string_p (groups guile-C-API gh C) (scan-data T)) +(gh_symbol2newstr (groups guile-C-API gh C) (scan-data T)) +(gh_symbol2scm (groups guile-C-API gh C) (scan-data T)) +(gh_symbol_p (groups guile-C-API gh C) (scan-data T)) +(gh_ulong2scm (groups guile-C-API gh C) (scan-data T)) +(gh_ulongs2uvect (groups guile-C-API gh C) (scan-data T)) +(gh_uniform_vector_length (groups guile-C-API gh C) (scan-data T)) +(gh_uniform_vector_ref (groups guile-C-API gh C) (scan-data T)) +(gh_vector_length (groups guile-C-API gh C) (scan-data T)) +(gh_vector_p (groups guile-C-API gh C) (scan-data T)) +(gh_vector_ref (groups guile-C-API gh C) (scan-data T)) +(gh_vector_set_x (groups guile-C-API gh C) (scan-data T)) +(gh_write (groups guile-C-API gh C) (scan-data T)) +(gmtime (groups POSIX Scheme) (scan-data "#")) +(group:gid (groups POSIX Scheme) (scan-data "#")) +(group:mem (groups POSIX Scheme) (scan-data "#")) +(group:name (groups POSIX Scheme) (scan-data "#")) +(group:passwd (groups POSIX Scheme) (scan-data "#")) +(guardian-destroyed? (groups Scheme) (scan-data "#")) +(guardian-greedy? (groups Scheme) (scan-data "#")) +(handle-system-error (groups Scheme) (scan-data "#")) +(has-shown-backtrace-hint? (groups Scheme) (scan-data "")) +(has-shown-debugger-hint? (groups Scheme) (scan-data "")) +(has-suffix? (groups Scheme) (scan-data "#")) +(hash (groups Scheme) (scan-data "#")) +(hash-create-handle! (groups Scheme) (scan-data "#")) +(hash-fold (groups Scheme) (scan-data "#")) +(hash-get-handle (groups Scheme) (scan-data "#")) +(hash-ref (groups Scheme) (scan-data "#")) +(hash-remove! (groups Scheme) (scan-data "#")) +(hash-set! (groups Scheme) (scan-data "#")) +(hashq (groups Scheme) (scan-data "#")) +(hashq-create-handle! (groups Scheme) (scan-data "#")) +(hashq-get-handle (groups Scheme) (scan-data "#")) +(hashq-ref (groups Scheme) (scan-data "#")) +(hashq-remove! (groups Scheme) (scan-data "#")) +(hashq-set! (groups Scheme) (scan-data "#")) +(hashv (groups Scheme) (scan-data "#")) +(hashv-create-handle! (groups Scheme) (scan-data "#")) +(hashv-get-handle (groups Scheme) (scan-data "#")) +(hashv-ref (groups Scheme) (scan-data "#")) +(hashv-remove! (groups Scheme) (scan-data "#")) +(hashv-set! (groups Scheme) (scan-data "#")) +(hashx-create-handle! (groups Scheme) (scan-data "#")) +(hashx-get-handle (groups Scheme) (scan-data "#")) +(hashx-ref (groups Scheme) (scan-data "#")) +(hashx-set! (groups Scheme) (scan-data "#")) +(hook->list (groups Scheme) (scan-data "#list>")) +(hook-empty? (groups Scheme) (scan-data "#")) +(hook? (groups Scheme) (scan-data "#")) +(hostent:addr-list (groups Scheme) (scan-data "#")) +(hostent:addrtype (groups Scheme) (scan-data "#")) +(hostent:aliases (groups Scheme) (scan-data "#")) +(hostent:length (groups Scheme) (scan-data "#")) +(hostent:name (groups Scheme) (scan-data "#")) +(htonl (groups Scheme) (scan-data "#")) +(htons (groups Scheme) (scan-data "#")) +(identity (groups Scheme) (scan-data "#")) +(if (groups Scheme) (scan-data "")) +(imag-part (groups Scheme) (scan-data "#")) +(import-environment-imports (groups Scheme) (scan-data "#")) +(import-environment-set-imports! (groups Scheme) (scan-data "#")) +(import-environment? (groups Scheme) (scan-data "#")) +(in-vicinity (groups Scheme) (scan-data "#")) +(include-deprecated-features (groups Scheme) (scan-data "#")) +(inet-aton (groups Scheme) (scan-data "#")) +(inet-lnaof (groups Scheme) (scan-data "#")) +(inet-makeaddr (groups Scheme) (scan-data "#")) +(inet-netof (groups Scheme) (scan-data "#")) +(inet-ntoa (groups Scheme) (scan-data "#")) +(inet-ntop (groups Scheme) (scan-data "#")) +(inet-pton (groups Scheme) (scan-data "#")) +(inexact->exact (groups Scheme) (scan-data "#exact>")) +(inexact? (groups Scheme) (scan-data "#")) +(inf (groups Scheme) (scan-data "#")) +(inf? (groups Scheme) (scan-data "#")) +(inherit-print-state (groups Scheme) (scan-data "#")) +(input-port? (groups Scheme) (scan-data "#")) +(integer->char (groups Scheme) (scan-data "#char>")) +(integer-expt (groups Scheme) (scan-data "#")) +(integer-length (groups Scheme) (scan-data "#")) +(integer? (groups Scheme) (scan-data "#")) +(interaction-environment (groups Scheme) (scan-data "#")) +(internal-time-units-per-second (groups Scheme) (scan-data "")) +(iota (groups Scheme) (scan-data "#")) +(ipow-by-squaring (groups Scheme) (scan-data "#")) +(isatty? (groups POSIX Scheme) (scan-data "#")) +(issue-deprecation-warning (groups Scheme) (scan-data "#")) +(join-thread (groups Scheme) (scan-data "#")) +(keyword->symbol (groups Scheme) (scan-data "#symbol (kw)>")) +(keyword-dash-symbol (groups Scheme) (scan-data "#")) +(keyword-like-symbol->keyword (groups Scheme) (scan-data "#keyword (sym)>")) +(keyword? (groups Scheme) (scan-data "#")) +(kill (groups POSIX Scheme) (scan-data "#")) +(kw-arg-ref (groups Scheme) (scan-data "#")) +(lambda (groups Scheme) (scan-data "")) +(last-pair (groups Scheme) (scan-data "#")) +(last-stack-frame (groups Scheme) (scan-data "#")) +(lazy-catch (groups Scheme) (scan-data "#")) +(lazy-handler-dispatch (groups Scheme) (scan-data "#")) +(lcm (groups Scheme) (scan-data "#")) +(leaf-environment? (groups Scheme) (scan-data "#")) +(length (groups Scheme) (scan-data "#")) +(let (groups Scheme) (scan-data "")) +(let* (groups Scheme) (scan-data "")) +(letrec (groups Scheme) (scan-data "")) +(link (groups POSIX Scheme) (scan-data "#")) +(list (groups Scheme) (scan-data "#")) +(list->array (groups Scheme) (scan-data "#array (ndim lst)>")) +(list->string (groups Scheme) (scan-data "#string>")) +(list->symbol (groups Scheme) (scan-data "#symbol args>")) +(list->uniform-array (groups Scheme) (scan-data "#uniform-array>")) +(list->uniform-vector (groups Scheme) (scan-data "#uniform-vector (prot lst)>")) +(list->vector (groups Scheme) (scan-data "#vector>")) +(list->weak-vector (groups Scheme) (scan-data "#weak-vector>")) +(list-cdr-ref (groups Scheme) (scan-data "#")) +(list-cdr-set! (groups Scheme) (scan-data "#")) +(list-copy (groups Scheme) (scan-data "#")) +(list-head (groups Scheme) (scan-data "#")) +(list-index (groups Scheme) (scan-data "#")) +(list-ref (groups Scheme) (scan-data "#")) +(list-set! (groups Scheme) (scan-data "#")) +(list-tail (groups Scheme) (scan-data "#")) +(list? (groups Scheme) (scan-data "#")) +(listen (groups Scheme) (scan-data "#")) +(load (groups Scheme) (scan-data "#")) +(load-compiled (groups Scheme) (scan-data "")) +(load-emacs-interface (groups Scheme) (scan-data "#")) +(load-extension (groups Scheme) (scan-data "#")) +(load-from-path (groups Scheme) (scan-data "#")) +(load-module (groups Scheme) (scan-data "#")) +(load-user-init (groups Scheme) (scan-data "#")) +(local-define (groups Scheme) (scan-data "#")) +(local-eval (groups Scheme) (scan-data "#")) +(local-ref (groups Scheme) (scan-data "#")) +(local-remove (groups Scheme) (scan-data "#")) +(local-set! (groups Scheme) (scan-data "#")) +(localtime (groups POSIX Scheme) (scan-data "#")) +(lock-mutex (groups Scheme) (scan-data "#")) +(log (groups Scheme) (scan-data "#")) +(log10 (groups Scheme) (scan-data "#")) +(logand (groups Scheme) (scan-data "#")) +(logbit? (groups Scheme) (scan-data "#")) +(logcount (groups Scheme) (scan-data "#")) +(logior (groups Scheme) (scan-data "#")) +(lognot (groups Scheme) (scan-data "#")) +(logtest (groups Scheme) (scan-data "#")) +(logxor (groups Scheme) (scan-data "#")) +(lstat (groups POSIX Scheme) (scan-data "#")) +(macro-name (groups Scheme) (scan-data "#")) +(macro-table (groups Scheme) (scan-data "")) +(macro-transformer (groups Scheme) (scan-data "#")) +(macro-type (groups Scheme) (scan-data "#")) +(macro? (groups Scheme) (scan-data "#")) +(macroexpand (groups Scheme) (scan-data "#")) +(macroexpand-1 (groups Scheme) (scan-data "#")) +(magnitude (groups Scheme) (scan-data "#")) +(major-version (groups Scheme) (scan-data "#")) +(make-arbiter (groups Scheme) (scan-data "#")) +(make-array (groups Scheme) (scan-data "#")) +(make-autoload-interface (groups Scheme) (scan-data "#")) +(make-class-object (groups Scheme) (scan-data "#")) +(make-condition-variable (groups Scheme) (scan-data "#")) +(make-doubly-weak-hash-table (groups Scheme) (scan-data "#")) +(make-eval-environment (groups Scheme) (scan-data "#")) +(make-export-environment (groups Scheme) (scan-data "#")) +(make-fluid (groups Scheme) (scan-data "#")) +(make-guardian (groups Scheme) (scan-data "#")) +(make-hash-table (groups Scheme) (scan-data "#")) +(make-hook (groups Scheme) (scan-data "#")) +(make-import-environment (groups Scheme) (scan-data "#")) +(make-keyword-from-dash-symbol (groups Scheme) (scan-data "#")) +(make-leaf-environment (groups Scheme) (scan-data "#")) +(make-list (groups Scheme) (scan-data "#")) +(make-module (groups Scheme) (scan-data "#")) +(make-modules-in (groups Scheme) (scan-data "#")) +(make-mutex (groups Scheme) (scan-data "#")) +(make-object-property (groups Scheme) (scan-data "#")) +(make-polar (groups Scheme) (scan-data "#")) +(make-procedure-with-setter (groups Scheme) (scan-data "#")) +(make-record-type (groups Scheme) (scan-data "#")) +(make-rectangular (groups Scheme) (scan-data "#")) +(make-regexp (groups Scheme) (scan-data "#")) +(make-root-module (groups Scheme) (scan-data "#")) +(make-scm-module (groups Scheme) (scan-data "#")) +(make-shared-array (groups Scheme) (scan-data "#")) +(make-soft-port (groups Scheme) (scan-data "#")) +(make-stack (groups Scheme) (scan-data "#")) +(make-string (groups Scheme) (scan-data "#")) +(make-struct (groups Scheme) (scan-data "#")) +(make-struct-layout (groups Scheme) (scan-data "#")) +(make-subclass-object (groups Scheme) (scan-data "#")) +(make-symbol (groups Scheme) (scan-data "#")) +(make-undefined-variable (groups Scheme) (scan-data "#")) +(make-uniform-array (groups Scheme) (scan-data "#")) +(make-uniform-vector (groups Scheme) (scan-data "#uniform-array>")) +(make-variable (groups Scheme) (scan-data "#")) +(make-vector (groups Scheme) (scan-data "#")) +(make-vtable-vtable (groups Scheme) (scan-data "#")) +(make-weak-key-hash-table (groups Scheme) (scan-data "#")) +(make-weak-value-hash-table (groups Scheme) (scan-data "#")) +(make-weak-vector (groups Scheme) (scan-data "#")) +(map (groups Scheme) (scan-data "#")) +(map-in-order (groups Scheme) (scan-data "#")) +(mask-signals (groups Scheme) (scan-data "#")) +(max (groups Scheme) (scan-data "#")) +(member (groups Scheme) (scan-data "#")) +(memoized-environment (groups Scheme) (scan-data "#")) +(memoized? (groups Scheme) (scan-data "#")) +(memq (groups Scheme) (scan-data "#")) +(memv (groups Scheme) (scan-data "#")) +(merge (groups Scheme) (scan-data "#")) +(merge! (groups Scheme) (scan-data "#")) +(micro-version (groups Scheme) (scan-data "#")) +(min (groups Scheme) (scan-data "#")) +(minor-version (groups Scheme) (scan-data "#")) +(mkdir (groups POSIX Scheme) (scan-data "#")) +(mknod (groups POSIX Scheme) (scan-data "#")) +(mkstemp! (groups POSIX Scheme) (scan-data "#")) +(mktime (groups POSIX Scheme) (scan-data "#")) +(module-add! (groups Scheme) (scan-data "#")) +(module-binder (groups Scheme) (scan-data "#")) +(module-bound? (groups Scheme) (scan-data "#")) +(module-clear! (groups Scheme) (scan-data "#")) +(module-constructor (groups Scheme) (scan-data "#")) +(module-define! (groups Scheme) (scan-data "#")) +(module-defined? (groups Scheme) (scan-data "#")) +(module-ensure-local-variable! (groups Scheme) (scan-data "#")) +(module-eval-closure (groups Scheme) (scan-data "#")) +(module-export! (groups Scheme) (scan-data "#")) +(module-for-each (groups Scheme) (scan-data "#")) +(module-kind (groups Scheme) (scan-data "#")) +(module-local-variable (groups Scheme) (scan-data "#")) +(module-locally-bound? (groups Scheme) (scan-data "#")) +(module-make-local-var! (groups Scheme) (scan-data "#")) +(module-map (groups Scheme) (scan-data "#")) +(module-modified (groups Scheme) (scan-data "#")) +(module-name (groups Scheme) (scan-data "#")) +(module-obarray (groups Scheme) (scan-data "#")) +(module-obarray-get-handle (groups Scheme) (scan-data "#")) +(module-obarray-ref (groups Scheme) (scan-data "#")) +(module-obarray-remove! (groups Scheme) (scan-data "#")) +(module-obarray-set! (groups Scheme) (scan-data "#")) +(module-observe (groups Scheme) (scan-data "#")) +(module-observe-weak (groups Scheme) (scan-data "#")) +(module-observer-id (groups Scheme) (scan-data "#")) +(module-observers (groups Scheme) (scan-data "#")) +(module-public-interface (groups Scheme) (scan-data "#")) +(module-re-export! (groups Scheme) (scan-data "#")) +(module-ref (groups Scheme) (scan-data "#")) +(module-remove! (groups Scheme) (scan-data "#")) +(module-search (groups Scheme) (scan-data "#")) +(module-set! (groups Scheme) (scan-data "#")) +(module-symbol-binding (groups Scheme) (scan-data "#")) +(module-symbol-interned? (groups Scheme) (scan-data "#")) +(module-symbol-local-binding (groups Scheme) (scan-data "#")) +(module-symbol-locally-interned? (groups Scheme) (scan-data "#")) +(module-transformer (groups Scheme) (scan-data "#")) +(module-type (groups Scheme) (scan-data "")) +(module-unobserve (groups Scheme) (scan-data "#")) +(module-use! (groups Scheme) (scan-data "#")) +(module-uses (groups Scheme) (scan-data "#")) +(module-variable (groups Scheme) (scan-data "#")) +(module-weak-observers (groups Scheme) (scan-data "#")) +(module? (groups Scheme) (scan-data "#")) +(modulo (groups Scheme) (scan-data "#")) +(most-negative-fixnum (groups Scheme) (scan-data "")) +(most-positive-fixnum (groups Scheme) (scan-data "")) +(move->fdes (groups POSIX Scheme) (scan-data "#fdes (fd/port fd)>")) +(named-module-use! (groups Scheme) (scan-data "#")) +(nan (groups Scheme) (scan-data "#")) +(nan? (groups Scheme) (scan-data "#")) +(negative? (groups Scheme) (scan-data "#")) +(nested-define! (groups Scheme) (scan-data "#")) +(nested-ref (groups Scheme) (scan-data "#")) +(nested-remove! (groups Scheme) (scan-data "#")) +(nested-set! (groups Scheme) (scan-data "#")) +(netent:addrtype (groups Scheme) (scan-data "#")) +(netent:aliases (groups Scheme) (scan-data "#")) +(netent:name (groups Scheme) (scan-data "#")) +(netent:net (groups Scheme) (scan-data "#")) +(newline (groups Scheme) (scan-data "#")) +(nice (groups POSIX Scheme) (scan-data "#")) +(nil-cond (groups Scheme) (scan-data "")) +(noop (groups Scheme) (scan-data "#")) +(not (groups Scheme) (scan-data "#")) +(ntohl (groups Scheme) (scan-data "#")) +(ntohs (groups Scheme) (scan-data "#")) +(null? (groups Scheme) (scan-data "#")) +(number->string (groups Scheme) (scan-data "#string>")) +(number? (groups Scheme) (scan-data "#")) +(object->string (groups Scheme) (scan-data "#string>")) +(object-address (groups Scheme) (scan-data "#")) +(object-properties (groups Scheme) (scan-data "#")) +(object-property (groups Scheme) (scan-data "#")) +(odd? (groups Scheme) (scan-data "#")) +(open (groups POSIX Scheme) (scan-data "#")) +(open-fdes (groups POSIX Scheme) (scan-data "#")) +(open-file (groups Scheme) (scan-data "#")) +(open-input-file (groups Scheme) (scan-data "#")) +(open-input-string (groups Scheme) (scan-data "#")) +(open-io-file (groups Scheme) (scan-data "#")) +(open-output-file (groups Scheme) (scan-data "#")) +(open-output-string (groups Scheme) (scan-data "#")) +(opendir (groups POSIX Scheme) (scan-data "#")) +(operator? (groups Scheme) (scan-data "#")) +(or (groups Scheme) (scan-data "")) +(or-map (groups Scheme) (scan-data "#")) +(output-port? (groups Scheme) (scan-data "#")) +(pair? (groups Scheme) (scan-data "#")) +(parse-path (groups Scheme) (scan-data "#")) +(passwd:dir (groups POSIX Scheme) (scan-data "#")) +(passwd:gecos (groups POSIX Scheme) (scan-data "#")) +(passwd:gid (groups POSIX Scheme) (scan-data "#")) +(passwd:name (groups POSIX Scheme) (scan-data "#")) +(passwd:passwd (groups POSIX Scheme) (scan-data "#")) +(passwd:shell (groups POSIX Scheme) (scan-data "#")) +(passwd:uid (groups POSIX Scheme) (scan-data "#")) +(pause (groups POSIX Scheme) (scan-data "#")) +(peek (groups Scheme) (scan-data "#")) +(peek-char (groups Scheme) (scan-data "#")) +(pipe (groups POSIX Scheme) (scan-data "#")) +(pk (groups Scheme) (scan-data "#")) +(port->fdes (groups POSIX Scheme) (scan-data "#fdes (port)>")) +(port-closed? (groups Scheme) (scan-data "#")) +(port-column (groups Scheme) (scan-data "#")) +(port-filename (groups Scheme) (scan-data "#")) +(port-for-each (groups POSIX Scheme) (scan-data "#")) +(port-line (groups Scheme) (scan-data "#")) +(port-mode (groups POSIX Scheme) (scan-data "#")) +(port-revealed (groups POSIX Scheme) (scan-data "#")) +(port-with-print-state (groups Scheme) (scan-data "#")) +(port? (groups Scheme) (scan-data "#")) +(positive? (groups Scheme) (scan-data "#")) +(primitive-eval (groups Scheme) (scan-data "#")) +(primitive-exit (groups POSIX Scheme) (scan-data "#")) +(primitive-fork (groups POSIX Scheme) (scan-data "#")) +(primitive-load (groups Scheme) (scan-data "#")) +(primitive-load-path (groups Scheme) (scan-data "#")) +(primitive-macro? (groups Scheme) (scan-data "#")) +(primitive-make-property (groups Scheme) (scan-data "#")) +(primitive-move->fdes (groups POSIX Scheme) (scan-data "#fdes>")) +(primitive-property-del! (groups Scheme) (scan-data "#")) +(primitive-property-ref (groups Scheme) (scan-data "#")) +(primitive-property-set! (groups Scheme) (scan-data "#")) +(print-disable (groups Scheme) (scan-data "#")) +(print-enable (groups Scheme) (scan-data "#")) +(print-options (groups Scheme) (scan-data "#")) +(print-options-interface (groups Scheme) (scan-data "#")) +(print-set! (groups Scheme) (scan-data "")) +(procedure (groups Scheme) (scan-data "#")) +(procedure->macro (groups Scheme) (scan-data "#macro>")) +(procedure->memoizing-macro (groups Scheme) (scan-data "#memoizing-macro>")) +(procedure->syntax (groups Scheme) (scan-data "#syntax>")) +(procedure-documentation (groups Scheme) (scan-data "#")) +(procedure-environment (groups Scheme) (scan-data "#")) +(procedure-name (groups Scheme) (scan-data "#")) +(procedure-properties (groups Scheme) (scan-data "#")) +(procedure-property (groups Scheme) (scan-data "#")) +(procedure-source (groups Scheme) (scan-data "#")) +(procedure-with-setter? (groups Scheme) (scan-data "#")) +(procedure? (groups Scheme) (scan-data "#")) +(process-define-module (groups Scheme) (scan-data "#")) +(process-use-modules (groups Scheme) (scan-data "#")) +(program-arguments (groups POSIX Scheme) (scan-data "#")) +(promise? (groups Scheme) (scan-data "#")) +(protoent:aliases (groups Scheme) (scan-data "#")) +(protoent:name (groups Scheme) (scan-data "#")) +(protoent:proto (groups Scheme) (scan-data "#")) +(provide (groups Scheme) (scan-data "#")) +(provided? (groups Scheme) (scan-data "#")) +(purify-module! (groups Scheme) (scan-data "#")) +(putenv (groups POSIX Scheme) (scan-data "#")) +(quasiquote (groups Scheme) (scan-data "")) +(quit (groups Scheme) (scan-data "#")) +(quote (groups Scheme) (scan-data "")) +(quotient (groups Scheme) (scan-data "#")) +(raise (groups POSIX Scheme) (scan-data "#")) +(random (groups Scheme) (scan-data "#")) +(random:exp (groups Scheme) (scan-data "#")) +(random:hollow-sphere! (groups Scheme) (scan-data "#")) +(random:normal (groups Scheme) (scan-data "#")) +(random:normal-vector! (groups Scheme) (scan-data "#")) +(random:solid-sphere! (groups Scheme) (scan-data "#")) +(random:uniform (groups Scheme) (scan-data "#")) +(rational? (groups Scheme) (scan-data "#")) +(re-export (groups Scheme) (scan-data "")) +(re-export-syntax (groups Scheme) (scan-data "")) +(read (groups Scheme) (scan-data "#")) +(read-char (groups Scheme) (scan-data "#")) +(read-disable (groups Scheme) (scan-data "#")) +(read-enable (groups Scheme) (scan-data "#")) +(read-eval? (groups Scheme) (scan-data "")) +(read-hash-extend (groups Scheme) (scan-data "#")) +(read-hash-procedures (groups Scheme) (scan-data "")) +(read-options (groups Scheme) (scan-data "#")) +(read-options-interface (groups Scheme) (scan-data "#")) +(read-set! (groups Scheme) (scan-data "")) +(read:array (groups Scheme) (scan-data "#")) +(read:uniform-vector (groups Scheme) (scan-data "#")) +(readdir (groups POSIX Scheme) (scan-data "#")) +(readlink (groups POSIX Scheme) (scan-data "#")) +(real-part (groups Scheme) (scan-data "#")) +(real? (groups Scheme) (scan-data "#")) +(record-accessor (groups Scheme) (scan-data "#")) +(record-constructor (groups Scheme) (scan-data "#")) +(record-modifier (groups Scheme) (scan-data "#")) +(record-predicate (groups Scheme) (scan-data "#")) +(record-type-descriptor (groups Scheme) (scan-data "#")) +(record-type-fields (groups Scheme) (scan-data "#")) +(record-type-name (groups Scheme) (scan-data "#")) +(record-type-vtable (groups Scheme) (scan-data "")) +(record-type? (groups Scheme) (scan-data "#")) +(record? (groups Scheme) (scan-data "#")) +(recv! (groups Scheme) (scan-data "#")) +(recvfrom! (groups Scheme) (scan-data "#")) +(redirect-port (groups POSIX Scheme) (scan-data "#")) +(regexp-exec (groups Scheme) (scan-data "#")) +(regexp/basic (groups Scheme) (scan-data "")) +(regexp/extended (groups Scheme) (scan-data "")) +(regexp/icase (groups Scheme) (scan-data "")) +(regexp/newline (groups Scheme) (scan-data "")) +(regexp/notbol (groups Scheme) (scan-data "")) +(regexp/noteol (groups Scheme) (scan-data "")) +(regexp? (groups Scheme) (scan-data "#")) +(release-arbiter (groups Scheme) (scan-data "#")) +(release-port-handle (groups POSIX Scheme) (scan-data "#")) +(remainder (groups Scheme) (scan-data "#")) +(remove-hook! (groups Scheme) (scan-data "#")) +(rename-file (groups POSIX Scheme) (scan-data "#")) +(repl (groups Scheme) (scan-data "#")) +(repl-reader (groups Scheme) (scan-data "#")) +(reset-hook! (groups Scheme) (scan-data "#")) +(resolve-interface (groups Scheme) (scan-data "#")) +(resolve-module (groups Scheme) (scan-data "#")) +(restore-signals (groups POSIX Scheme) (scan-data "#")) +(restricted-vector-sort! (groups Scheme) (scan-data "#")) +(reverse (groups Scheme) (scan-data "#")) +(reverse! (groups Scheme) (scan-data "#")) +(rewinddir (groups POSIX Scheme) (scan-data "#")) +(rmdir (groups POSIX Scheme) (scan-data "#")) +(round (groups Scheme) (scan-data "#")) +(run-asyncs (groups Scheme) (scan-data "#")) +(run-hook (groups Scheme) (scan-data "#")) +(save-module-excursion (groups Scheme) (scan-data "#")) +(save-stack (groups Scheme) (scan-data "#")) +(scheme-file-suffix (groups Scheme) (scan-data "#")) +(scm-error (groups Scheme) (scan-data "#")) +(scm-repl-print-unspecified (groups Scheme) (scan-data "")) +(scm-repl-prompt (groups Scheme) (scan-data "")) +(scm-repl-silent (groups Scheme) (scan-data "")) +(scm-repl-verbose (groups Scheme) (scan-data "")) +(scm-style-repl (groups Scheme) (scan-data "#")) +(scm_I_am_dead (groups scm C) (scan-data B)) +(scm_abs (groups scm C) (scan-data T)) +(scm_accept (groups scm C) (scan-data T)) +(scm_access (groups scm C) (scan-data T)) +(scm_accessor_method_slot_definition (groups scm C) (scan-data T)) +(scm_acons (groups scm C) (scan-data T)) +(scm_acosh (groups scm C) (scan-data T)) +(scm_add_feature (groups scm C) (scan-data T)) +(scm_add_hook_x (groups scm C) (scan-data T)) +(scm_add_method (groups scm C) (scan-data T)) +(scm_add_slot (groups scm C) (scan-data T)) +(scm_add_to_port_table (groups scm C) (scan-data T)) +(scm_addbig (groups scm C) (scan-data T)) +(scm_after_gc_c_hook (groups scm C) (scan-data B)) +(scm_after_gc_hook (groups scm C) (scan-data B)) +(scm_after_sweep_c_hook (groups scm C) (scan-data B)) +(scm_aind (groups scm C) (scan-data T)) +(scm_alarm (groups scm C) (scan-data T)) +(scm_alloc_struct (groups scm C) (scan-data T)) +(scm_allocate_string (groups scm C) (scan-data T)) +(scm_angle (groups scm C) (scan-data T)) +(scm_append (groups scm C) (scan-data T)) +(scm_append_x (groups scm C) (scan-data T)) +(scm_apply (groups scm C) (scan-data T)) +(scm_apply_0 (groups scm C) (scan-data T)) +(scm_apply_1 (groups scm C) (scan-data T)) +(scm_apply_2 (groups scm C) (scan-data T)) +(scm_apply_3 (groups scm C) (scan-data T)) +(scm_apply_generic (groups scm C) (scan-data T)) +(scm_apply_with_dynamic_root (groups scm C) (scan-data T)) +(scm_arg_type_key (groups scm C) (scan-data B)) +(scm_args_number_key (groups scm C) (scan-data B)) +(scm_array_contents (groups scm C) (scan-data T)) +(scm_array_copy_x (groups scm C) (scan-data T)) +(scm_array_dimensions (groups scm C) (scan-data T)) +(scm_array_equal_p (groups scm C) (scan-data T)) +(scm_array_fill_int (groups scm C) (scan-data T)) +(scm_array_fill_x (groups scm C) (scan-data T)) +(scm_array_for_each (groups scm C) (scan-data T)) +(scm_array_identity (groups scm C) (scan-data T)) +(scm_array_in_bounds_p (groups scm C) (scan-data T)) +(scm_array_index_map_x (groups scm C) (scan-data T)) +(scm_array_map_x (groups scm C) (scan-data T)) +(scm_array_p (groups scm C) (scan-data T)) +(scm_array_prototype (groups scm C) (scan-data T)) +(scm_array_rank (groups scm C) (scan-data T)) +(scm_array_set_x (groups scm C) (scan-data T)) +(scm_array_to_list (groups scm C) (scan-data T)) +(scm_ash (groups scm C) (scan-data T)) +(scm_asinh (groups scm C) (scan-data T)) +(scm_assoc (groups scm C) (scan-data T)) +(scm_assoc_ref (groups scm C) (scan-data T)) +(scm_assoc_remove_x (groups scm C) (scan-data T)) +(scm_assoc_set_x (groups scm C) (scan-data T)) +(scm_assq (groups scm C) (scan-data T)) +(scm_assq_ref (groups scm C) (scan-data T)) +(scm_assq_remove_x (groups scm C) (scan-data T)) +(scm_assq_set_x (groups scm C) (scan-data T)) +(scm_assv (groups scm C) (scan-data T)) +(scm_assv_ref (groups scm C) (scan-data T)) +(scm_assv_remove_x (groups scm C) (scan-data T)) +(scm_assv_set_x (groups scm C) (scan-data T)) +(scm_async (groups scm C) (scan-data T)) +(scm_async_click (groups scm C) (scan-data T)) +(scm_async_mark (groups scm C) (scan-data T)) +(scm_asyncs_pending_p (groups scm C) (scan-data D)) +(scm_atanh (groups scm C) (scan-data T)) +(scm_backtrace (groups scm C) (scan-data T)) +(scm_badargsp (groups scm C) (scan-data T)) +(scm_basename (groups scm C) (scan-data T)) +(scm_basic_basic_make_class (groups scm C) (scan-data T)) +(scm_basic_make_class (groups scm C) (scan-data T)) +(scm_before_gc_c_hook (groups scm C) (scan-data B)) +(scm_before_mark_c_hook (groups scm C) (scan-data B)) +(scm_before_sweep_c_hook (groups scm C) (scan-data B)) +(scm_big_and (groups scm C) (scan-data T)) +(scm_big_ior (groups scm C) (scan-data T)) +(scm_big_test (groups scm C) (scan-data T)) +(scm_big_xor (groups scm C) (scan-data T)) +(scm_bigcomp (groups scm C) (scan-data T)) +(scm_bigequal (groups scm C) (scan-data T)) +(scm_bigprint (groups scm C) (scan-data T)) +(scm_bind (groups scm C) (scan-data T)) +(scm_bit_count (groups scm C) (scan-data T)) +(scm_bit_count_star (groups scm C) (scan-data T)) +(scm_bit_extract (groups scm C) (scan-data T)) +(scm_bit_invert_x (groups scm C) (scan-data T)) +(scm_bit_position (groups scm C) (scan-data T)) +(scm_bit_set_star_x (groups scm C) (scan-data T)) +(scm_block_gc (groups scm C) (scan-data D)) +(scm_body_thunk (groups scm C) (scan-data T)) +(scm_boolean_p (groups scm C) (scan-data T)) +(scm_boot_guile (groups scm C) (scan-data T)) +(scm_boot_guile_1_live (groups scm C) (scan-data D)) +(scm_c_call_with_current_module (groups scm C) (scan-data T)) +(scm_c_chars2byvect (groups scm C) (scan-data T)) +(scm_c_chars2scm (groups scm C) (scan-data T)) +(scm_c_default_rstate (groups scm C) (scan-data T)) +(scm_c_define (groups scm C) (scan-data T)) +(scm_c_define_gsubr (groups scm C) (scan-data T)) +(scm_c_define_gsubr_with_generic (groups scm C) (scan-data T)) +(scm_c_define_module (groups scm C) (scan-data T)) +(scm_c_define_subr (groups scm C) (scan-data T)) +(scm_c_define_subr_with_generic (groups scm C) (scan-data T)) +(scm_c_doubles2dvect (groups scm C) (scan-data T)) +(scm_c_doubles2scm (groups scm C) (scan-data T)) +(scm_c_environment_cell (groups scm C) (scan-data T)) +(scm_c_environment_fold (groups scm C) (scan-data T)) +(scm_c_environment_observe (groups scm C) (scan-data T)) +(scm_c_environment_ref (groups scm C) (scan-data T)) +(scm_c_eval_string (groups scm C) (scan-data T)) +(scm_c_exp1 (groups scm C) (scan-data T)) +(scm_c_export (groups scm C) (scan-data T)) +(scm_c_floats2fvect (groups scm C) (scan-data T)) +(scm_c_floats2scm (groups scm C) (scan-data T)) +(scm_c_get_internal_run_time (groups scm C) (scan-data T)) +(scm_c_hook_add (groups scm C) (scan-data T)) +(scm_c_hook_init (groups scm C) (scan-data T)) +(scm_c_hook_remove (groups scm C) (scan-data T)) +(scm_c_hook_run (groups scm C) (scan-data T)) +(scm_c_ints2ivect (groups scm C) (scan-data T)) +(scm_c_ints2scm (groups scm C) (scan-data T)) +(scm_c_issue_deprecation_warning (groups scm C) (scan-data T)) +(scm_c_issue_deprecation_warning_fmt (groups scm C) (scan-data T)) +(scm_c_load_extension (groups scm C) (scan-data T)) +(scm_c_longs2ivect (groups scm C) (scan-data T)) +(scm_c_longs2scm (groups scm C) (scan-data T)) +(scm_c_lookup (groups scm C) (scan-data T)) +(scm_c_make_gsubr (groups scm C) (scan-data T)) +(scm_c_make_gsubr_with_generic (groups scm C) (scan-data T)) +(scm_c_make_hash_table (groups scm C) (scan-data T)) +(scm_c_make_keyword (groups scm C) (scan-data T)) +(scm_c_make_rstate (groups scm C) (scan-data T)) +(scm_c_make_subr (groups scm C) (scan-data T)) +(scm_c_make_subr_with_generic (groups scm C) (scan-data T)) +(scm_c_make_vector (groups scm C) (scan-data T)) +(scm_c_memq (groups scm C) (scan-data T)) +(scm_c_module_define (groups scm C) (scan-data T)) +(scm_c_module_lookup (groups scm C) (scan-data T)) +(scm_c_normal01 (groups scm C) (scan-data T)) +(scm_c_primitive_load (groups scm C) (scan-data T)) +(scm_c_primitive_load_path (groups scm C) (scan-data T)) +(scm_c_random (groups scm C) (scan-data T)) +(scm_c_random_bignum (groups scm C) (scan-data T)) +(scm_c_read (groups scm C) (scan-data T)) +(scm_c_read_string (groups scm C) (scan-data T)) +(scm_c_register_extension (groups scm C) (scan-data T)) +(scm_c_resolve_module (groups scm C) (scan-data T)) +(scm_c_run_hook (groups scm C) (scan-data T)) +(scm_c_scm2chars (groups scm C) (scan-data T)) +(scm_c_scm2doubles (groups scm C) (scan-data T)) +(scm_c_scm2floats (groups scm C) (scan-data T)) +(scm_c_scm2ints (groups scm C) (scan-data T)) +(scm_c_scm2longs (groups scm C) (scan-data T)) +(scm_c_scm2shorts (groups scm C) (scan-data T)) +(scm_c_shorts2scm (groups scm C) (scan-data T)) +(scm_c_shorts2svect (groups scm C) (scan-data T)) +(scm_c_source_property_breakpoint_p (groups scm C) (scan-data T)) +(scm_c_string2str (groups scm C) (scan-data T)) +(scm_c_substring2str (groups scm C) (scan-data T)) +(scm_c_symbol2str (groups scm C) (scan-data T)) +(scm_c_uints2uvect (groups scm C) (scan-data T)) +(scm_c_ulongs2uvect (groups scm C) (scan-data T)) +(scm_c_uniform01 (groups scm C) (scan-data T)) +(scm_c_use_module (groups scm C) (scan-data T)) +(scm_c_with_fluid (groups scm C) (scan-data T)) +(scm_c_with_fluids (groups scm C) (scan-data T)) +(scm_c_write (groups scm C) (scan-data T)) +(scm_call_0 (groups scm C) (scan-data T)) +(scm_call_1 (groups scm C) (scan-data T)) +(scm_call_2 (groups scm C) (scan-data T)) +(scm_call_3 (groups scm C) (scan-data T)) +(scm_call_4 (groups scm C) (scan-data T)) +(scm_call_generic_0 (groups scm C) (scan-data T)) +(scm_call_generic_1 (groups scm C) (scan-data T)) +(scm_call_generic_2 (groups scm C) (scan-data T)) +(scm_call_generic_3 (groups scm C) (scan-data T)) +(scm_call_with_dynamic_root (groups scm C) (scan-data T)) +(scm_call_with_input_string (groups scm C) (scan-data T)) +(scm_call_with_new_thread (groups scm C) (scan-data T)) +(scm_call_with_output_string (groups scm C) (scan-data T)) +(scm_casei_streq (groups scm C) (scan-data T)) +(scm_catch (groups scm C) (scan-data T)) +(scm_cellp (groups scm C) (scan-data T)) +(scm_cells_allocated (groups scm C) (scan-data D)) +(scm_ceval (groups scm C) (scan-data T)) +(scm_ceval_ptr (groups scm C) (scan-data B)) +(scm_change_object_class (groups scm C) (scan-data T)) +(scm_char_alphabetic_p (groups scm C) (scan-data T)) +(scm_char_ci_eq_p (groups scm C) (scan-data T)) +(scm_char_ci_geq_p (groups scm C) (scan-data T)) +(scm_char_ci_gr_p (groups scm C) (scan-data T)) +(scm_char_ci_leq_p (groups scm C) (scan-data T)) +(scm_char_ci_less_p (groups scm C) (scan-data T)) +(scm_char_downcase (groups scm C) (scan-data T)) +(scm_char_eq_p (groups scm C) (scan-data T)) +(scm_char_geq_p (groups scm C) (scan-data T)) +(scm_char_gr_p (groups scm C) (scan-data T)) +(scm_char_is_both_p (groups scm C) (scan-data T)) +(scm_char_leq_p (groups scm C) (scan-data T)) +(scm_char_less_p (groups scm C) (scan-data T)) +(scm_char_lower_case_p (groups scm C) (scan-data T)) +(scm_char_numeric_p (groups scm C) (scan-data T)) +(scm_char_p (groups scm C) (scan-data T)) +(scm_char_ready_p (groups scm C) (scan-data T)) +(scm_char_to_integer (groups scm C) (scan-data T)) +(scm_char_upcase (groups scm C) (scan-data T)) +(scm_char_upper_case_p (groups scm C) (scan-data T)) +(scm_char_whitespace_p (groups scm C) (scan-data T)) +(scm_charnames (groups scm C) (scan-data D)) +(scm_charnums (groups scm C) (scan-data R)) +(scm_chdir (groups scm C) (scan-data T)) +(scm_check_apply_p (groups scm C) (scan-data B)) +(scm_check_entry_p (groups scm C) (scan-data B)) +(scm_check_exit_p (groups scm C) (scan-data B)) +(scm_chmod (groups scm C) (scan-data T)) +(scm_chown (groups scm C) (scan-data T)) +(scm_chroot (groups scm C) (scan-data T)) +(scm_class_accessor (groups scm C) (scan-data B)) +(scm_class_boolean (groups scm C) (scan-data B)) +(scm_class_char (groups scm C) (scan-data B)) +(scm_class_class (groups scm C) (scan-data B)) +(scm_class_complex (groups scm C) (scan-data B)) +(scm_class_direct_methods (groups scm C) (scan-data T)) +(scm_class_direct_slots (groups scm C) (scan-data T)) +(scm_class_direct_subclasses (groups scm C) (scan-data T)) +(scm_class_direct_supers (groups scm C) (scan-data T)) +(scm_class_double (groups scm C) (scan-data B)) +(scm_class_entity (groups scm C) (scan-data B)) +(scm_class_entity_class (groups scm C) (scan-data B)) +(scm_class_entity_with_setter (groups scm C) (scan-data B)) +(scm_class_environment (groups scm C) (scan-data T)) +(scm_class_float (groups scm C) (scan-data B)) +(scm_class_foreign_class (groups scm C) (scan-data B)) +(scm_class_foreign_object (groups scm C) (scan-data B)) +(scm_class_foreign_slot (groups scm C) (scan-data B)) +(scm_class_generic (groups scm C) (scan-data B)) +(scm_class_generic_with_setter (groups scm C) (scan-data B)) +(scm_class_input_output_port (groups scm C) (scan-data B)) +(scm_class_input_port (groups scm C) (scan-data B)) +(scm_class_int (groups scm C) (scan-data B)) +(scm_class_integer (groups scm C) (scan-data B)) +(scm_class_keyword (groups scm C) (scan-data B)) +(scm_class_list (groups scm C) (scan-data B)) +(scm_class_method (groups scm C) (scan-data B)) +(scm_class_name (groups scm C) (scan-data T)) +(scm_class_null (groups scm C) (scan-data B)) +(scm_class_number (groups scm C) (scan-data B)) +(scm_class_object (groups scm C) (scan-data B)) +(scm_class_of (groups scm C) (scan-data T)) +(scm_class_opaque (groups scm C) (scan-data B)) +(scm_class_operator_class (groups scm C) (scan-data B)) +(scm_class_operator_with_setter_class (groups scm C) (scan-data B)) +(scm_class_output_port (groups scm C) (scan-data B)) +(scm_class_pair (groups scm C) (scan-data B)) +(scm_class_port (groups scm C) (scan-data B)) +(scm_class_precedence_list (groups scm C) (scan-data T)) +(scm_class_primitive_generic (groups scm C) (scan-data B)) +(scm_class_procedure (groups scm C) (scan-data B)) +(scm_class_procedure_class (groups scm C) (scan-data B)) +(scm_class_procedure_with_setter (groups scm C) (scan-data B)) +(scm_class_protected (groups scm C) (scan-data B)) +(scm_class_protected_opaque (groups scm C) (scan-data B)) +(scm_class_protected_read_only (groups scm C) (scan-data B)) +(scm_class_read_only (groups scm C) (scan-data B)) +(scm_class_real (groups scm C) (scan-data B)) +(scm_class_scm (groups scm C) (scan-data B)) +(scm_class_self (groups scm C) (scan-data B)) +(scm_class_simple_method (groups scm C) (scan-data B)) +(scm_class_slots (groups scm C) (scan-data T)) +(scm_class_string (groups scm C) (scan-data B)) +(scm_class_symbol (groups scm C) (scan-data B)) +(scm_class_top (groups scm C) (scan-data B)) +(scm_class_unknown (groups scm C) (scan-data B)) +(scm_class_vector (groups scm C) (scan-data B)) +(scm_close (groups scm C) (scan-data T)) +(scm_close_fdes (groups scm C) (scan-data T)) +(scm_close_input_port (groups scm C) (scan-data T)) +(scm_close_output_port (groups scm C) (scan-data T)) +(scm_close_port (groups scm C) (scan-data T)) +(scm_closedir (groups scm C) (scan-data T)) +(scm_closure (groups scm C) (scan-data T)) +(scm_closure_p (groups scm C) (scan-data T)) +(scm_compile_shell_switches (groups scm C) (scan-data T)) +(scm_complex_equalp (groups scm C) (scan-data T)) +(scm_components (groups scm C) (scan-data B)) +(scm_compute_applicable_methods (groups scm C) (scan-data T)) +(scm_connect (groups scm C) (scan-data T)) +(scm_cons (groups scm C) (scan-data T)) +(scm_cons2 (groups scm C) (scan-data T)) +(scm_cons_source (groups scm C) (scan-data T)) +(scm_cons_star (groups scm C) (scan-data T)) +(scm_copy_big_dec (groups scm C) (scan-data T)) +(scm_copy_file (groups scm C) (scan-data T)) +(scm_copy_fluids (groups scm C) (scan-data T)) +(scm_copy_random_state (groups scm C) (scan-data T)) +(scm_copy_smaller (groups scm C) (scan-data T)) +(scm_copy_tree (groups scm C) (scan-data T)) +(scm_count_argv (groups scm C) (scan-data T)) +(scm_critical_section_mutex (groups scm C) (scan-data B)) +(scm_crypt (groups scm C) (scan-data T)) +(scm_ctermid (groups scm C) (scan-data T)) +(scm_current_error_port (groups scm C) (scan-data T)) +(scm_current_input_port (groups scm C) (scan-data T)) +(scm_current_load_port (groups scm C) (scan-data T)) +(scm_current_module (groups scm C) (scan-data T)) +(scm_current_module_lookup_closure (groups scm C) (scan-data T)) +(scm_current_module_transformer (groups scm C) (scan-data T)) +(scm_current_output_port (groups scm C) (scan-data T)) +(scm_current_time (groups scm C) (scan-data T)) +(scm_cuserid (groups scm C) (scan-data T)) +(scm_cvref (groups scm C) (scan-data T)) +(scm_dapply (groups scm C) (scan-data T)) +(scm_dblprec (groups scm C) (scan-data B)) +(scm_debug_eframe_size (groups scm C) (scan-data B)) +(scm_debug_mode (groups scm C) (scan-data B)) +(scm_debug_object_p (groups scm C) (scan-data T)) +(scm_debug_options (groups scm C) (scan-data T)) +(scm_debug_opts (groups scm C) (scan-data D)) +(scm_default_init_heap_size_1 (groups scm C) (scan-data D)) +(scm_default_init_heap_size_2 (groups scm C) (scan-data D)) +(scm_default_max_segment_size (groups scm C) (scan-data D)) +(scm_default_min_yield_1 (groups scm C) (scan-data D)) +(scm_default_min_yield_2 (groups scm C) (scan-data D)) +(scm_define (groups scm C) (scan-data T)) +(scm_definedp (groups scm C) (scan-data T)) +(scm_delete (groups scm C) (scan-data T)) +(scm_delete1_x (groups scm C) (scan-data T)) +(scm_delete_file (groups scm C) (scan-data T)) +(scm_delete_x (groups scm C) (scan-data T)) +(scm_delq (groups scm C) (scan-data T)) +(scm_delq1_x (groups scm C) (scan-data T)) +(scm_delq_x (groups scm C) (scan-data T)) +(scm_delv (groups scm C) (scan-data T)) +(scm_delv1_x (groups scm C) (scan-data T)) +(scm_delv_x (groups scm C) (scan-data T)) +(scm_deprecated_newcell (groups scm C) (scan-data T)) +(scm_deprecated_newcell2 (groups scm C) (scan-data T)) +(scm_destroy_guardian_x (groups scm C) (scan-data T)) +(scm_deval (groups scm C) (scan-data T)) +(scm_difference (groups scm C) (scan-data T)) +(scm_dimensions_to_uniform_array (groups scm C) (scan-data T)) +(scm_directory_stream_p (groups scm C) (scan-data T)) +(scm_dirname (groups scm C) (scan-data T)) +(scm_display (groups scm C) (scan-data T)) +(scm_display_application (groups scm C) (scan-data T)) +(scm_display_backtrace (groups scm C) (scan-data T)) +(scm_display_error (groups scm C) (scan-data T)) +(scm_display_error_message (groups scm C) (scan-data T)) +(scm_divbigdig (groups scm C) (scan-data T)) +(scm_divide (groups scm C) (scan-data T)) +(scm_done_free (groups scm C) (scan-data T)) +(scm_done_malloc (groups scm C) (scan-data T)) +(scm_dot_string (groups scm C) (scan-data B)) +(scm_double2num (groups scm C) (scan-data T)) +(scm_doubly_weak_hash_table_p (groups scm C) (scan-data T)) +(scm_dowinds (groups scm C) (scan-data T)) +(scm_downcase (groups scm C) (scan-data T)) +(scm_drain_input (groups scm C) (scan-data T)) +(scm_dup2 (groups scm C) (scan-data T)) +(scm_dup_to_fdes (groups scm C) (scan-data T)) +(scm_dynamic_args_call (groups scm C) (scan-data T)) +(scm_dynamic_call (groups scm C) (scan-data T)) +(scm_dynamic_func (groups scm C) (scan-data T)) +(scm_dynamic_link (groups scm C) (scan-data T)) +(scm_dynamic_object_p (groups scm C) (scan-data T)) +(scm_dynamic_root (groups scm C) (scan-data T)) +(scm_dynamic_unlink (groups scm C) (scan-data T)) +(scm_dynamic_wind (groups scm C) (scan-data T)) +(scm_enable_primitive_generic_x (groups scm C) (scan-data T)) +(scm_enclose_array (groups scm C) (scan-data T)) +(scm_end_input (groups scm C) (scan-data T)) +(scm_ensure_accessor (groups scm C) (scan-data T)) +(scm_entity_p (groups scm C) (scan-data T)) +(scm_env_module (groups scm C) (scan-data T)) +(scm_env_top_level (groups scm C) (scan-data T)) +(scm_environ (groups scm C) (scan-data T)) +(scm_environment_bound_p (groups scm C) (scan-data T)) +(scm_environment_cell (groups scm C) (scan-data T)) +(scm_environment_define (groups scm C) (scan-data T)) +(scm_environment_fold (groups scm C) (scan-data T)) +(scm_environment_observe (groups scm C) (scan-data T)) +(scm_environment_observe_weak (groups scm C) (scan-data T)) +(scm_environment_p (groups scm C) (scan-data T)) +(scm_environment_ref (groups scm C) (scan-data T)) +(scm_environment_set_x (groups scm C) (scan-data T)) +(scm_environment_undefine (groups scm C) (scan-data T)) +(scm_environment_unobserve (groups scm C) (scan-data T)) +(scm_environments_prehistory (groups scm C) (scan-data T)) +(scm_eof_object_p (groups scm C) (scan-data T)) +(scm_eq_p (groups scm C) (scan-data T)) +(scm_equal_p (groups scm C) (scan-data T)) +(scm_eqv_p (groups scm C) (scan-data T)) +(scm_error (groups scm C) (scan-data T)) +(scm_error_environment_immutable_binding (groups scm C) (scan-data T)) +(scm_error_environment_immutable_location (groups scm C) (scan-data T)) +(scm_error_environment_unbound (groups scm C) (scan-data T)) +(scm_error_num_args_subr (groups scm C) (scan-data T)) +(scm_error_revive_threads (groups scm C) (scan-data T)) +(scm_error_scm (groups scm C) (scan-data T)) +(scm_eval (groups scm C) (scan-data T)) +(scm_eval_args (groups scm C) (scan-data T)) +(scm_eval_body (groups scm C) (scan-data T)) +(scm_eval_car (groups scm C) (scan-data T)) +(scm_eval_closure_lookup (groups scm C) (scan-data T)) +(scm_eval_environment_imported (groups scm C) (scan-data T)) +(scm_eval_environment_local (groups scm C) (scan-data T)) +(scm_eval_environment_p (groups scm C) (scan-data T)) +(scm_eval_environment_set_imported_x (groups scm C) (scan-data T)) +(scm_eval_environment_set_local_x (groups scm C) (scan-data T)) +(scm_eval_options_interface (groups scm C) (scan-data T)) +(scm_eval_opts (groups scm C) (scan-data D)) +(scm_eval_stack (groups scm C) (scan-data B)) +(scm_eval_string (groups scm C) (scan-data T)) +(scm_eval_x (groups scm C) (scan-data T)) +(scm_evaluator_trap_table (groups scm C) (scan-data D)) +(scm_evaluator_traps (groups scm C) (scan-data T)) +(scm_even_p (groups scm C) (scan-data T)) +(scm_evict_ports (groups scm C) (scan-data T)) +(scm_exact_p (groups scm C) (scan-data T)) +(scm_exact_to_inexact (groups scm C) (scan-data T)) +(scm_execl (groups scm C) (scan-data T)) +(scm_execle (groups scm C) (scan-data T)) +(scm_execlp (groups scm C) (scan-data T)) +(scm_exit_status (groups scm C) (scan-data T)) +(scm_expmem (groups scm C) (scan-data D)) +(scm_export_environment_p (groups scm C) (scan-data T)) +(scm_export_environment_private (groups scm C) (scan-data T)) +(scm_export_environment_set_private_x (groups scm C) (scan-data T)) +(scm_export_environment_set_signature_x (groups scm C) (scan-data T)) +(scm_export_environment_signature (groups scm C) (scan-data T)) +(scm_f_apply (groups scm C) (scan-data B)) +(scm_f_gsubr_apply (groups scm C) (scan-data B)) +(scm_fcntl (groups scm C) (scan-data T)) +(scm_fdes_to_port (groups scm C) (scan-data T)) +(scm_fdes_to_ports (groups scm C) (scan-data T)) +(scm_fdopen (groups scm C) (scan-data T)) +(scm_file_port_p (groups scm C) (scan-data T)) +(scm_fileno (groups scm C) (scan-data T)) +(scm_fill_input (groups scm C) (scan-data T)) +(scm_find_executable (groups scm C) (scan-data T)) +(scm_find_method (groups scm C) (scan-data T)) +(scm_finish_srcprop (groups scm C) (scan-data T)) +(scm_float2num (groups scm C) (scan-data T)) +(scm_flock (groups scm C) (scan-data T)) +(scm_fluid_p (groups scm C) (scan-data T)) +(scm_fluid_ref (groups scm C) (scan-data T)) +(scm_fluid_set_x (groups scm C) (scan-data T)) +(scm_flush (groups scm C) (scan-data T)) +(scm_flush_all_ports (groups scm C) (scan-data T)) +(scm_flush_ws (groups scm C) (scan-data T)) +(scm_for_each (groups scm C) (scan-data T)) +(scm_force (groups scm C) (scan-data T)) +(scm_force_output (groups scm C) (scan-data T)) +(scm_fork (groups scm C) (scan-data T)) +(scm_frame_arguments (groups scm C) (scan-data T)) +(scm_frame_evaluating_args_p (groups scm C) (scan-data T)) +(scm_frame_next (groups scm C) (scan-data T)) +(scm_frame_number (groups scm C) (scan-data T)) +(scm_frame_overflow_p (groups scm C) (scan-data T)) +(scm_frame_p (groups scm C) (scan-data T)) +(scm_frame_previous (groups scm C) (scan-data T)) +(scm_frame_procedure (groups scm C) (scan-data T)) +(scm_frame_procedure_p (groups scm C) (scan-data T)) +(scm_frame_real_p (groups scm C) (scan-data T)) +(scm_frame_source (groups scm C) (scan-data T)) +(scm_free0 (groups scm C) (scan-data T)) +(scm_free_print_state (groups scm C) (scan-data T)) +(scm_free_subr_entry (groups scm C) (scan-data T)) +(scm_freelist (groups scm C) (scan-data D)) +(scm_freelist2 (groups scm C) (scan-data D)) +(scm_fsync (groups scm C) (scan-data T)) +(scm_ftell (groups scm C) (scan-data T)) +(scm_gc (groups scm C) (scan-data T)) +(scm_gc_cells_collected (groups scm C) (scan-data B)) +(scm_gc_cells_marked_acc (groups scm C) (scan-data D)) +(scm_gc_cells_swept (groups scm C) (scan-data D)) +(scm_gc_cells_swept_acc (groups scm C) (scan-data D)) +(scm_gc_for_newcell (groups scm C) (scan-data T)) +(scm_gc_free (groups scm C) (scan-data T)) +(scm_gc_heap_lock (groups scm C) (scan-data D)) +(scm_gc_malloc (groups scm C) (scan-data T)) +(scm_gc_malloc_collected (groups scm C) (scan-data B)) +(scm_gc_mark (groups scm C) (scan-data T)) +(scm_gc_mark_dependencies (groups scm C) (scan-data T)) +(scm_gc_mark_time_taken (groups scm C) (scan-data D)) +(scm_gc_ports_collected (groups scm C) (scan-data B)) +(scm_gc_protect_object (groups scm C) (scan-data T)) +(scm_gc_realloc (groups scm C) (scan-data T)) +(scm_gc_register_collectable_memory (groups scm C) (scan-data T)) +(scm_gc_register_root (groups scm C) (scan-data T)) +(scm_gc_register_roots (groups scm C) (scan-data T)) +(scm_gc_running_p (groups scm C) (scan-data D)) +(scm_gc_stats (groups scm C) (scan-data T)) +(scm_gc_strdup (groups scm C) (scan-data T)) +(scm_gc_strndup (groups scm C) (scan-data T)) +(scm_gc_sweep (groups scm C) (scan-data T)) +(scm_gc_sweep_time_taken (groups scm C) (scan-data D)) +(scm_gc_time_taken (groups scm C) (scan-data D)) +(scm_gc_times (groups scm C) (scan-data D)) +(scm_gc_unprotect_object (groups scm C) (scan-data T)) +(scm_gc_unregister_collectable_memory (groups scm C) (scan-data T)) +(scm_gc_unregister_root (groups scm C) (scan-data T)) +(scm_gc_unregister_roots (groups scm C) (scan-data T)) +(scm_gc_yield (groups scm C) (scan-data B)) +(scm_gcd (groups scm C) (scan-data T)) +(scm_generic_capability_p (groups scm C) (scan-data T)) +(scm_generic_function_methods (groups scm C) (scan-data T)) +(scm_generic_function_name (groups scm C) (scan-data T)) +(scm_gensym (groups scm C) (scan-data T)) +(scm_geq_p (groups scm C) (scan-data T)) +(scm_get_internal_real_time (groups scm C) (scan-data T)) +(scm_get_internal_run_time (groups scm C) (scan-data T)) +(scm_get_keyword (groups scm C) (scan-data T)) +(scm_get_meta_args (groups scm C) (scan-data T)) +(scm_get_one_zombie (groups scm C) (scan-data T)) +(scm_get_output_string (groups scm C) (scan-data T)) +(scm_get_pre_modules_obarray (groups scm C) (scan-data T)) +(scm_get_print_state (groups scm C) (scan-data T)) +(scm_get_stack_base (groups scm C) (scan-data T)) +(scm_getc (groups scm C) (scan-data T)) +(scm_getcwd (groups scm C) (scan-data T)) +(scm_getegid (groups scm C) (scan-data T)) +(scm_getenv (groups scm C) (scan-data T)) +(scm_geteuid (groups scm C) (scan-data T)) +(scm_getgid (groups scm C) (scan-data T)) +(scm_getgrgid (groups scm C) (scan-data T)) +(scm_getgroups (groups scm C) (scan-data T)) +(scm_gethost (groups scm C) (scan-data T)) +(scm_gethostname (groups scm C) (scan-data T)) +(scm_getitimer (groups scm C) (scan-data T)) +(scm_getlogin (groups scm C) (scan-data T)) +(scm_getnet (groups scm C) (scan-data T)) +(scm_getpass (groups scm C) (scan-data T)) +(scm_getpeername (groups scm C) (scan-data T)) +(scm_getpgrp (groups scm C) (scan-data T)) +(scm_getpid (groups scm C) (scan-data T)) +(scm_getppid (groups scm C) (scan-data T)) +(scm_getpriority (groups scm C) (scan-data T)) +(scm_getproto (groups scm C) (scan-data T)) +(scm_getpwuid (groups scm C) (scan-data T)) +(scm_getserv (groups scm C) (scan-data T)) +(scm_getsockname (groups scm C) (scan-data T)) +(scm_getsockopt (groups scm C) (scan-data T)) +(scm_gettimeofday (groups scm C) (scan-data T)) +(scm_getuid (groups scm C) (scan-data T)) +(scm_gmtime (groups scm C) (scan-data T)) +(scm_gr_p (groups scm C) (scan-data T)) +(scm_grow_tok_buf (groups scm C) (scan-data T)) +(scm_gsubr_apply (groups scm C) (scan-data T)) +(scm_guard (groups scm C) (scan-data T)) +(scm_guardian_destroyed_p (groups scm C) (scan-data T)) +(scm_guardian_greedy_p (groups scm C) (scan-data T)) +(scm_handle_by_message (groups scm C) (scan-data T)) +(scm_handle_by_message_noexit (groups scm C) (scan-data T)) +(scm_handle_by_proc (groups scm C) (scan-data T)) +(scm_handle_by_proc_catching_all (groups scm C) (scan-data T)) +(scm_handle_by_throw (groups scm C) (scan-data T)) +(scm_hash (groups scm C) (scan-data T)) +(scm_hash_create_handle_x (groups scm C) (scan-data T)) +(scm_hash_fn_create_handle_x (groups scm C) (scan-data T)) +(scm_hash_fn_get_handle (groups scm C) (scan-data T)) +(scm_hash_fn_ref (groups scm C) (scan-data T)) +(scm_hash_fn_remove_x (groups scm C) (scan-data T)) +(scm_hash_fn_set_x (groups scm C) (scan-data T)) +(scm_hash_fold (groups scm C) (scan-data T)) +(scm_hash_get_handle (groups scm C) (scan-data T)) +(scm_hash_ref (groups scm C) (scan-data T)) +(scm_hash_remove_x (groups scm C) (scan-data T)) +(scm_hash_set_x (groups scm C) (scan-data T)) +(scm_hasher (groups scm C) (scan-data T)) +(scm_hashq (groups scm C) (scan-data T)) +(scm_hashq_create_handle_x (groups scm C) (scan-data T)) +(scm_hashq_get_handle (groups scm C) (scan-data T)) +(scm_hashq_ref (groups scm C) (scan-data T)) +(scm_hashq_remove_x (groups scm C) (scan-data T)) +(scm_hashq_set_x (groups scm C) (scan-data T)) +(scm_hashv (groups scm C) (scan-data T)) +(scm_hashv_create_handle_x (groups scm C) (scan-data T)) +(scm_hashv_get_handle (groups scm C) (scan-data T)) +(scm_hashv_ref (groups scm C) (scan-data T)) +(scm_hashv_remove_x (groups scm C) (scan-data T)) +(scm_hashv_set_x (groups scm C) (scan-data T)) +(scm_hashx_create_handle_x (groups scm C) (scan-data T)) +(scm_hashx_get_handle (groups scm C) (scan-data T)) +(scm_hashx_ref (groups scm C) (scan-data T)) +(scm_hashx_remove_x (groups scm C) (scan-data T)) +(scm_hashx_set_x (groups scm C) (scan-data T)) +(scm_heap_org (groups scm C) (scan-data B)) +(scm_heap_table (groups scm C) (scan-data D)) +(scm_hook_empty_p (groups scm C) (scan-data T)) +(scm_hook_p (groups scm C) (scan-data T)) +(scm_hook_to_list (groups scm C) (scan-data T)) +(scm_htonl (groups scm C) (scan-data T)) +(scm_htons (groups scm C) (scan-data T)) +(scm_i_adjbig (groups scm libguile-internal C) (scan-data T)) +(scm_i_big2dbl (groups scm libguile-internal C) (scan-data T)) +(scm_i_big2inum (groups scm libguile-internal C) (scan-data T)) +(scm_i_copy_rstate (groups scm libguile-internal C) (scan-data T)) +(scm_i_copybig (groups scm libguile-internal C) (scan-data T)) +(scm_i_dbl2big (groups scm libguile-internal C) (scan-data T)) +(scm_i_display_error (groups scm libguile-internal C) (scan-data T)) +(scm_i_dummy (groups scm libguile-internal C) (scan-data B)) +(scm_i_eval (groups scm libguile-internal C) (scan-data T)) +(scm_i_eval_x (groups scm libguile-internal C) (scan-data T)) +(scm_i_get_keyword (groups scm libguile-internal C) (scan-data T)) +(scm_i_init_rstate (groups scm libguile-internal C) (scan-data T)) +(scm_i_int2big (groups scm libguile-internal C) (scan-data T)) +(scm_i_long2big (groups scm libguile-internal C) (scan-data T)) +(scm_i_long_long2big (groups scm libguile-internal C) (scan-data T)) +(scm_i_make_class_object (groups scm libguile-internal C) (scan-data T)) +(scm_i_mem2number (groups scm libguile-internal C) (scan-data T)) +(scm_i_mkbig (groups scm libguile-internal C) (scan-data T)) +(scm_i_normbig (groups scm libguile-internal C) (scan-data T)) +(scm_i_procedure_arity (groups scm libguile-internal C) (scan-data T)) +(scm_i_ptrdiff2big (groups scm libguile-internal C) (scan-data T)) +(scm_i_short2big (groups scm libguile-internal C) (scan-data T)) +(scm_i_size2big (groups scm libguile-internal C) (scan-data T)) +(scm_i_terminating (groups scm libguile-internal C) (scan-data B)) +(scm_i_uint2big (groups scm libguile-internal C) (scan-data T)) +(scm_i_ulong2big (groups scm libguile-internal C) (scan-data T)) +(scm_i_ulong_long2big (groups scm libguile-internal C) (scan-data T)) +(scm_i_uniform32 (groups scm libguile-internal C) (scan-data T)) +(scm_i_ushort2big (groups scm libguile-internal C) (scan-data T)) +(scm_i_variable_print (groups scm libguile-internal C) (scan-data T)) +(scm_ice_9_already_loaded (groups scm C) (scan-data D)) +(scm_igc (groups scm C) (scan-data T)) +(scm_ihash (groups scm C) (scan-data T)) +(scm_ihashq (groups scm C) (scan-data T)) +(scm_ihashv (groups scm C) (scan-data T)) +(scm_iint2str (groups scm C) (scan-data T)) +(scm_ilength (groups scm C) (scan-data T)) +(scm_ilookup (groups scm C) (scan-data T)) +(scm_imag_part (groups scm C) (scan-data T)) +(scm_import_environment_imports (groups scm C) (scan-data T)) +(scm_import_environment_p (groups scm C) (scan-data T)) +(scm_import_environment_set_imports_x (groups scm C) (scan-data T)) +(scm_include_deprecated_features (groups scm C) (scan-data T)) +(scm_inet_aton (groups scm C) (scan-data T)) +(scm_inet_makeaddr (groups scm C) (scan-data T)) +(scm_inet_netof (groups scm C) (scan-data T)) +(scm_inet_ntoa (groups scm C) (scan-data T)) +(scm_inet_ntop (groups scm C) (scan-data T)) +(scm_inet_pton (groups scm C) (scan-data T)) +(scm_inexact_p (groups scm C) (scan-data T)) +(scm_inexact_to_exact (groups scm C) (scan-data T)) +(scm_inf (groups scm C) (scan-data T)) +(scm_inf_p (groups scm C) (scan-data T)) +(scm_init_alist (groups scm C) (scan-data T)) +(scm_init_arbiters (groups scm C) (scan-data T)) +(scm_init_async (groups scm C) (scan-data T)) +(scm_init_backtrace (groups scm C) (scan-data T)) +(scm_init_boolean (groups scm C) (scan-data T)) +(scm_init_chars (groups scm C) (scan-data T)) +(scm_init_continuations (groups scm C) (scan-data T)) +(scm_init_debug (groups scm C) (scan-data T)) +(scm_init_deprecation (groups scm C) (scan-data T)) +(scm_init_dynamic_linking (groups scm C) (scan-data T)) +(scm_init_dynwind (groups scm C) (scan-data T)) +(scm_init_environments (groups scm C) (scan-data T)) +(scm_init_eq (groups scm C) (scan-data T)) +(scm_init_error (groups scm C) (scan-data T)) +(scm_init_eval (groups scm C) (scan-data T)) +(scm_init_evalext (groups scm C) (scan-data T)) +(scm_init_extensions (groups scm C) (scan-data T)) +(scm_init_feature (groups scm C) (scan-data T)) +(scm_init_filesys (groups scm C) (scan-data T)) +(scm_init_fluids (groups scm C) (scan-data T)) +(scm_init_fports (groups scm C) (scan-data T)) +(scm_init_gc (groups scm C) (scan-data T)) +(scm_init_gdbint (groups scm C) (scan-data T)) +(scm_init_goops (groups scm C) (scan-data T)) +(scm_init_goops_builtins (groups scm C) (scan-data T)) +(scm_init_gsubr (groups scm C) (scan-data T)) +(scm_init_guardians (groups scm C) (scan-data T)) +(scm_init_guile (groups scm C) (scan-data T)) +(scm_init_hash (groups scm C) (scan-data T)) +(scm_init_hashtab (groups scm C) (scan-data T)) +(scm_init_hooks (groups scm C) (scan-data T)) +(scm_init_ioext (groups scm C) (scan-data T)) +(scm_init_iselect (groups scm C) (scan-data T)) +(scm_init_keywords (groups scm C) (scan-data T)) +(scm_init_lang (groups scm C) (scan-data T)) +(scm_init_list (groups scm C) (scan-data T)) +(scm_init_load (groups scm C) (scan-data T)) +(scm_init_load_path (groups scm C) (scan-data T)) +(scm_init_macros (groups scm C) (scan-data T)) +(scm_init_mallocs (groups scm C) (scan-data T)) +(scm_init_modules (groups scm C) (scan-data T)) +(scm_init_net_db (groups scm C) (scan-data T)) +(scm_init_numbers (groups scm C) (scan-data T)) +(scm_init_objects (groups scm C) (scan-data T)) +(scm_init_objprop (groups scm C) (scan-data T)) +(scm_init_options (groups scm C) (scan-data T)) +(scm_init_opts (groups scm C) (scan-data T)) +(scm_init_pairs (groups scm C) (scan-data T)) +(scm_init_ports (groups scm C) (scan-data T)) +(scm_init_posix (groups scm C) (scan-data T)) +(scm_init_print (groups scm C) (scan-data T)) +(scm_init_procprop (groups scm C) (scan-data T)) +(scm_init_procs (groups scm C) (scan-data T)) +(scm_init_properties (groups scm C) (scan-data T)) +(scm_init_ramap (groups scm C) (scan-data T)) +(scm_init_random (groups scm C) (scan-data T)) +(scm_init_rdelim (groups scm C) (scan-data T)) +(scm_init_rdelim_builtins (groups scm C) (scan-data T)) +(scm_init_read (groups scm C) (scan-data T)) +(scm_init_regex_posix (groups scm C) (scan-data T)) +(scm_init_root (groups scm C) (scan-data T)) +(scm_init_rw (groups scm C) (scan-data T)) +(scm_init_rw_builtins (groups scm C) (scan-data T)) +(scm_init_scmsigs (groups scm C) (scan-data T)) +(scm_init_script (groups scm C) (scan-data T)) +(scm_init_simpos (groups scm C) (scan-data T)) +(scm_init_socket (groups scm C) (scan-data T)) +(scm_init_sort (groups scm C) (scan-data T)) +(scm_init_srcprop (groups scm C) (scan-data T)) +(scm_init_stackchk (groups scm C) (scan-data T)) +(scm_init_stacks (groups scm C) (scan-data T)) +(scm_init_stime (groups scm C) (scan-data T)) +(scm_init_storage (groups scm C) (scan-data T)) +(scm_init_strings (groups scm C) (scan-data T)) +(scm_init_strop (groups scm C) (scan-data T)) +(scm_init_strorder (groups scm C) (scan-data T)) +(scm_init_strports (groups scm C) (scan-data T)) +(scm_init_struct (groups scm C) (scan-data T)) +(scm_init_subr_table (groups scm C) (scan-data T)) +(scm_init_symbols (groups scm C) (scan-data T)) +(scm_init_threads (groups scm C) (scan-data T)) +(scm_init_throw (groups scm C) (scan-data T)) +(scm_init_unif (groups scm C) (scan-data T)) +(scm_init_values (groups scm C) (scan-data T)) +(scm_init_variable (groups scm C) (scan-data T)) +(scm_init_vectors (groups scm C) (scan-data T)) +(scm_init_version (groups scm C) (scan-data T)) +(scm_init_vports (groups scm C) (scan-data T)) +(scm_init_weaks (groups scm C) (scan-data T)) +(scm_initialized_p (groups scm C) (scan-data D)) +(scm_input_port_p (groups scm C) (scan-data T)) +(scm_instance_p (groups scm C) (scan-data T)) +(scm_int2num (groups scm C) (scan-data T)) +(scm_integer_expt (groups scm C) (scan-data T)) +(scm_integer_length (groups scm C) (scan-data T)) +(scm_integer_p (groups scm C) (scan-data T)) +(scm_integer_to_char (groups scm C) (scan-data T)) +(scm_interaction_environment (groups scm C) (scan-data T)) +(scm_internal_catch (groups scm C) (scan-data T)) +(scm_internal_cwdr (groups scm C) (scan-data T)) +(scm_internal_dynamic_wind (groups scm C) (scan-data T)) +(scm_internal_hash_fold (groups scm C) (scan-data T)) +(scm_internal_lazy_catch (groups scm C) (scan-data T)) +(scm_internal_parse_path (groups scm C) (scan-data T)) +(scm_internal_select (groups scm C) (scan-data T)) +(scm_internal_stack_catch (groups scm C) (scan-data T)) +(scm_intprint (groups scm C) (scan-data T)) +(scm_ints_disabled (groups scm C) (scan-data D)) +(scm_iprin1 (groups scm C) (scan-data T)) +(scm_iprlist (groups scm C) (scan-data T)) +(scm_ipruk (groups scm C) (scan-data T)) +(scm_isatty_p (groups scm C) (scan-data T)) +(scm_issue_deprecation_warning (groups scm C) (scan-data T)) +(scm_istr2bve (groups scm C) (scan-data T)) +(scm_isymnames (groups scm C) (scan-data D)) +(scm_ithrow (groups scm C) (scan-data T)) +(scm_join_thread (groups scm C) (scan-data T)) +(scm_keyword_dash_symbol (groups scm C) (scan-data T)) +(scm_keyword_p (groups scm C) (scan-data T)) +(scm_kill (groups scm C) (scan-data T)) +(scm_last_pair (groups scm C) (scan-data T)) +(scm_last_stack_frame (groups scm C) (scan-data T)) +(scm_lazy_catch (groups scm C) (scan-data T)) +(scm_lcm (groups scm C) (scan-data T)) +(scm_leaf_environment_p (groups scm C) (scan-data T)) +(scm_length (groups scm C) (scan-data T)) +(scm_leq_p (groups scm C) (scan-data T)) +(scm_less_p (groups scm C) (scan-data T)) +(scm_lfwrite (groups scm C) (scan-data T)) +(scm_link (groups scm C) (scan-data T)) +(scm_list (groups scm C) (scan-data T)) +(scm_list_1 (groups scm C) (scan-data T)) +(scm_list_2 (groups scm C) (scan-data T)) +(scm_list_3 (groups scm C) (scan-data T)) +(scm_list_4 (groups scm C) (scan-data T)) +(scm_list_5 (groups scm C) (scan-data T)) +(scm_list_cdr_set_x (groups scm C) (scan-data T)) +(scm_list_copy (groups scm C) (scan-data T)) +(scm_list_head (groups scm C) (scan-data T)) +(scm_list_n (groups scm C) (scan-data T)) +(scm_list_p (groups scm C) (scan-data T)) +(scm_list_ref (groups scm C) (scan-data T)) +(scm_list_set_x (groups scm C) (scan-data T)) +(scm_list_tail (groups scm C) (scan-data T)) +(scm_list_to_uniform_array (groups scm C) (scan-data T)) +(scm_listen (groups scm C) (scan-data T)) +(scm_listofnullstr (groups scm C) (scan-data B)) +(scm_lnaof (groups scm C) (scan-data T)) +(scm_load_extension (groups scm C) (scan-data T)) +(scm_load_goops (groups scm C) (scan-data T)) +(scm_load_startup_files (groups scm C) (scan-data T)) +(scm_local_eval (groups scm C) (scan-data T)) +(scm_localtime (groups scm C) (scan-data T)) +(scm_lock_mutex (groups scm C) (scan-data T)) +(scm_logand (groups scm C) (scan-data T)) +(scm_logbit_p (groups scm C) (scan-data T)) +(scm_logcount (groups scm C) (scan-data T)) +(scm_logior (groups scm C) (scan-data T)) +(scm_lognot (groups scm C) (scan-data T)) +(scm_logtest (groups scm C) (scan-data T)) +(scm_logxor (groups scm C) (scan-data T)) +(scm_long2num (groups scm C) (scan-data T)) +(scm_long_long2num (groups scm C) (scan-data T)) +(scm_lookup (groups scm C) (scan-data T)) +(scm_lookup_closure_module (groups scm C) (scan-data T)) +(scm_lookupcar (groups scm C) (scan-data T)) +(scm_lreadparen (groups scm C) (scan-data T)) +(scm_lreadr (groups scm C) (scan-data T)) +(scm_lreadrecparen (groups scm C) (scan-data T)) +(scm_lstat (groups scm C) (scan-data T)) +(scm_m_and (groups scm C) (scan-data T)) +(scm_m_apply (groups scm C) (scan-data T)) +(scm_m_at_call_with_values (groups scm C) (scan-data T)) +(scm_m_atbind (groups scm C) (scan-data T)) +(scm_m_atdispatch (groups scm C) (scan-data T)) +(scm_m_atfop (groups scm C) (scan-data T)) +(scm_m_atslot_ref (groups scm C) (scan-data T)) +(scm_m_atslot_set_x (groups scm C) (scan-data T)) +(scm_m_begin (groups scm C) (scan-data T)) +(scm_m_case (groups scm C) (scan-data T)) +(scm_m_cond (groups scm C) (scan-data T)) +(scm_m_cont (groups scm C) (scan-data T)) +(scm_m_define (groups scm C) (scan-data T)) +(scm_m_delay (groups scm C) (scan-data T)) +(scm_m_do (groups scm C) (scan-data T)) +(scm_m_expand_body (groups scm C) (scan-data T)) +(scm_m_generalized_set_x (groups scm C) (scan-data T)) +(scm_m_if (groups scm C) (scan-data T)) +(scm_m_lambda (groups scm C) (scan-data T)) +(scm_m_let (groups scm C) (scan-data T)) +(scm_m_letrec (groups scm C) (scan-data T)) +(scm_m_letstar (groups scm C) (scan-data T)) +(scm_m_nil_cond (groups scm C) (scan-data T)) +(scm_m_or (groups scm C) (scan-data T)) +(scm_m_quasiquote (groups scm C) (scan-data T)) +(scm_m_quote (groups scm C) (scan-data T)) +(scm_m_set_x (groups scm C) (scan-data T)) +(scm_m_undefine (groups scm C) (scan-data T)) +(scm_macro_name (groups scm C) (scan-data T)) +(scm_macro_p (groups scm C) (scan-data T)) +(scm_macro_transformer (groups scm C) (scan-data T)) +(scm_macro_type (groups scm C) (scan-data T)) +(scm_macroexp (groups scm C) (scan-data T)) +(scm_magnitude (groups scm C) (scan-data T)) +(scm_major_version (groups scm C) (scan-data T)) +(scm_makacro (groups scm C) (scan-data T)) +(scm_makcclo (groups scm C) (scan-data T)) +(scm_make (groups scm C) (scan-data T)) +(scm_make_arbiter (groups scm C) (scan-data T)) +(scm_make_class (groups scm C) (scan-data T)) +(scm_make_class_object (groups scm C) (scan-data T)) +(scm_make_complex (groups scm C) (scan-data T)) +(scm_make_condition_variable (groups scm C) (scan-data T)) +(scm_make_continuation (groups scm C) (scan-data T)) +(scm_make_debugobj (groups scm C) (scan-data T)) +(scm_make_doubly_weak_hash_table (groups scm C) (scan-data T)) +(scm_make_environment (groups scm C) (scan-data T)) +(scm_make_eval_environment (groups scm C) (scan-data T)) +(scm_make_export_environment (groups scm C) (scan-data T)) +(scm_make_extended_class (groups scm C) (scan-data T)) +(scm_make_fluid (groups scm C) (scan-data T)) +(scm_make_foreign_object (groups scm C) (scan-data T)) +(scm_make_guardian (groups scm C) (scan-data T)) +(scm_make_hook (groups scm C) (scan-data T)) +(scm_make_import_environment (groups scm C) (scan-data T)) +(scm_make_initial_fluids (groups scm C) (scan-data T)) +(scm_make_keyword_from_dash_symbol (groups scm C) (scan-data T)) +(scm_make_leaf_environment (groups scm C) (scan-data T)) +(scm_make_memoized (groups scm C) (scan-data T)) +(scm_make_method_cache (groups scm C) (scan-data T)) +(scm_make_mutex (groups scm C) (scan-data T)) +(scm_make_polar (groups scm C) (scan-data T)) +(scm_make_port_classes (groups scm C) (scan-data T)) +(scm_make_port_type (groups scm C) (scan-data T)) +(scm_make_print_state (groups scm C) (scan-data T)) +(scm_make_procedure_with_setter (groups scm C) (scan-data T)) +(scm_make_ra (groups scm C) (scan-data T)) +(scm_make_real (groups scm C) (scan-data T)) +(scm_make_rectangular (groups scm C) (scan-data T)) +(scm_make_regexp (groups scm C) (scan-data T)) +(scm_make_root (groups scm C) (scan-data T)) +(scm_make_shared_array (groups scm C) (scan-data T)) +(scm_make_smob (groups scm C) (scan-data T)) +(scm_make_smob_type (groups scm C) (scan-data T)) +(scm_make_soft_port (groups scm C) (scan-data T)) +(scm_make_srcprops (groups scm C) (scan-data T)) +(scm_make_stack (groups scm C) (scan-data T)) +(scm_make_string (groups scm C) (scan-data T)) +(scm_make_struct (groups scm C) (scan-data T)) +(scm_make_struct_layout (groups scm C) (scan-data T)) +(scm_make_subclass_object (groups scm C) (scan-data T)) +(scm_make_symbol (groups scm C) (scan-data T)) +(scm_make_synt (groups scm C) (scan-data T)) +(scm_make_undefined_variable (groups scm C) (scan-data T)) +(scm_make_uve (groups scm C) (scan-data T)) +(scm_make_variable (groups scm C) (scan-data T)) +(scm_make_vector (groups scm C) (scan-data T)) +(scm_make_vtable_vtable (groups scm C) (scan-data T)) +(scm_make_weak_key_hash_table (groups scm C) (scan-data T)) +(scm_make_weak_value_hash_table (groups scm C) (scan-data T)) +(scm_make_weak_vector (groups scm C) (scan-data T)) +(scm_makfrom0str (groups scm C) (scan-data T)) +(scm_makfrom0str_opt (groups scm C) (scan-data T)) +(scm_makfromstrs (groups scm C) (scan-data T)) +(scm_makmacro (groups scm C) (scan-data T)) +(scm_makmmacro (groups scm C) (scan-data T)) +(scm_makprom (groups scm C) (scan-data T)) +(scm_malloc (groups scm C) (scan-data T)) +(scm_malloc_obj (groups scm C) (scan-data T)) +(scm_mallocated (groups scm C) (scan-data D)) +(scm_map (groups scm C) (scan-data T)) +(scm_mark0 (groups scm C) (scan-data T)) +(scm_mark_locations (groups scm C) (scan-data T)) +(scm_mark_subr_table (groups scm C) (scan-data T)) +(scm_markcdr (groups scm C) (scan-data T)) +(scm_markstream (groups scm C) (scan-data T)) +(scm_mask_ints (groups scm C) (scan-data D)) +(scm_mask_signals (groups scm C) (scan-data T)) +(scm_masktab (groups scm C) (scan-data B)) +(scm_master_freelist (groups scm C) (scan-data D)) +(scm_master_freelist2 (groups scm C) (scan-data D)) +(scm_max (groups scm C) (scan-data T)) +(scm_max_segment_size (groups scm C) (scan-data B)) +(scm_mcache_compute_cmethod (groups scm C) (scan-data T)) +(scm_mcache_lookup_cmethod (groups scm C) (scan-data T)) +(scm_mem2string (groups scm C) (scan-data T)) +(scm_mem2symbol (groups scm C) (scan-data T)) +(scm_mem2uninterned_symbol (groups scm C) (scan-data T)) +(scm_member (groups scm C) (scan-data T)) +(scm_memoize_method (groups scm C) (scan-data T)) +(scm_memoized_environment (groups scm C) (scan-data T)) +(scm_memoized_p (groups scm C) (scan-data T)) +(scm_memory_alloc_key (groups scm C) (scan-data B)) +(scm_memory_error (groups scm C) (scan-data T)) +(scm_memq (groups scm C) (scan-data T)) +(scm_memv (groups scm C) (scan-data T)) +(scm_merge (groups scm C) (scan-data T)) +(scm_merge_x (groups scm C) (scan-data T)) +(scm_metaclass_operator (groups scm C) (scan-data B)) +(scm_metaclass_standard (groups scm C) (scan-data B)) +(scm_method_generic_function (groups scm C) (scan-data T)) +(scm_method_procedure (groups scm C) (scan-data T)) +(scm_method_specializers (groups scm C) (scan-data T)) +(scm_micro_version (groups scm C) (scan-data T)) +(scm_min (groups scm C) (scan-data T)) +(scm_minor_version (groups scm C) (scan-data T)) +(scm_misc_error (groups scm C) (scan-data T)) +(scm_misc_error_key (groups scm C) (scan-data B)) +(scm_mkdir (groups scm C) (scan-data T)) +(scm_mknod (groups scm C) (scan-data T)) +(scm_mkstemp (groups scm C) (scan-data T)) +(scm_mkstrport (groups scm C) (scan-data T)) +(scm_mktime (groups scm C) (scan-data T)) +(scm_mode_bits (groups scm C) (scan-data T)) +(scm_module_define (groups scm C) (scan-data T)) +(scm_module_goops (groups scm C) (scan-data B)) +(scm_module_lookup (groups scm C) (scan-data T)) +(scm_module_lookup_closure (groups scm C) (scan-data T)) +(scm_module_reverse_lookup (groups scm C) (scan-data T)) +(scm_module_system_booted_p (groups scm C) (scan-data D)) +(scm_module_tag (groups scm C) (scan-data B)) +(scm_module_transformer (groups scm C) (scan-data T)) +(scm_modules_prehistory (groups scm C) (scan-data T)) +(scm_modulo (groups scm C) (scan-data T)) +(scm_mtrigger (groups scm C) (scan-data B)) +(scm_mulbig (groups scm C) (scan-data T)) +(scm_must_free (groups scm C) (scan-data T)) +(scm_must_malloc (groups scm C) (scan-data T)) +(scm_must_realloc (groups scm C) (scan-data T)) +(scm_must_strdup (groups scm C) (scan-data T)) +(scm_must_strndup (groups scm C) (scan-data T)) +(scm_n_charnames (groups scm C) (scan-data D)) +(scm_n_heap_segs (groups scm C) (scan-data D)) +(scm_nan (groups scm C) (scan-data T)) +(scm_nan_p (groups scm C) (scan-data T)) +(scm_nconc2last (groups scm C) (scan-data T)) +(scm_negative_p (groups scm C) (scan-data T)) +(scm_newline (groups scm C) (scan-data T)) +(scm_nice (groups scm C) (scan-data T)) +(scm_no_applicable_method (groups scm C) (scan-data B)) +(scm_noop (groups scm C) (scan-data T)) +(scm_not (groups scm C) (scan-data T)) +(scm_ntohl (groups scm C) (scan-data T)) +(scm_ntohs (groups scm C) (scan-data T)) +(scm_null_p (groups scm C) (scan-data T)) +(scm_num2dbl (groups scm C) (scan-data T)) +(scm_num2double (groups scm C) (scan-data T)) +(scm_num2float (groups scm C) (scan-data T)) +(scm_num2int (groups scm C) (scan-data T)) +(scm_num2long (groups scm C) (scan-data T)) +(scm_num2long_long (groups scm C) (scan-data T)) +(scm_num2ptrdiff (groups scm C) (scan-data T)) +(scm_num2short (groups scm C) (scan-data T)) +(scm_num2size (groups scm C) (scan-data T)) +(scm_num2uint (groups scm C) (scan-data T)) +(scm_num2ulong (groups scm C) (scan-data T)) +(scm_num2ulong_long (groups scm C) (scan-data T)) +(scm_num2ushort (groups scm C) (scan-data T)) +(scm_num_eq_p (groups scm C) (scan-data T)) +(scm_num_overflow (groups scm C) (scan-data T)) +(scm_num_overflow_key (groups scm C) (scan-data B)) +(scm_number_p (groups scm C) (scan-data T)) +(scm_number_to_string (groups scm C) (scan-data T)) +(scm_numptob (groups scm C) (scan-data B)) +(scm_numsmob (groups scm C) (scan-data B)) +(scm_object_address (groups scm C) (scan-data T)) +(scm_object_properties (groups scm C) (scan-data T)) +(scm_object_property (groups scm C) (scan-data T)) +(scm_object_to_string (groups scm C) (scan-data T)) +(scm_odd_p (groups scm C) (scan-data T)) +(scm_open (groups scm C) (scan-data T)) +(scm_open_fdes (groups scm C) (scan-data T)) +(scm_open_file (groups scm C) (scan-data T)) +(scm_open_input_string (groups scm C) (scan-data T)) +(scm_open_output_string (groups scm C) (scan-data T)) +(scm_opendir (groups scm C) (scan-data T)) +(scm_operator_p (groups scm C) (scan-data T)) +(scm_options (groups scm C) (scan-data T)) +(scm_out_of_range (groups scm C) (scan-data T)) +(scm_out_of_range_key (groups scm C) (scan-data B)) +(scm_out_of_range_pos (groups scm C) (scan-data T)) +(scm_output_port_p (groups scm C) (scan-data T)) +(scm_pair_p (groups scm C) (scan-data T)) +(scm_parse_path (groups scm C) (scan-data T)) +(scm_pause (groups scm C) (scan-data T)) +(scm_peek_char (groups scm C) (scan-data T)) +(scm_permanent_object (groups scm C) (scan-data T)) +(scm_pipe (groups scm C) (scan-data T)) +(scm_port_class (groups scm C) (scan-data D)) +(scm_port_closed_p (groups scm C) (scan-data T)) +(scm_port_column (groups scm C) (scan-data T)) +(scm_port_filename (groups scm C) (scan-data T)) +(scm_port_for_each (groups scm C) (scan-data T)) +(scm_port_line (groups scm C) (scan-data T)) +(scm_port_mode (groups scm C) (scan-data T)) +(scm_port_non_buffer (groups scm C) (scan-data T)) +(scm_port_p (groups scm C) (scan-data T)) +(scm_port_print (groups scm C) (scan-data T)) +(scm_port_revealed (groups scm C) (scan-data T)) +(scm_port_table (groups scm C) (scan-data B)) +(scm_port_table_room (groups scm C) (scan-data D)) +(scm_port_table_size (groups scm C) (scan-data D)) +(scm_port_with_print_state (groups scm C) (scan-data T)) +(scm_ports_prehistory (groups scm C) (scan-data T)) +(scm_positive_p (groups scm C) (scan-data T)) +(scm_pre_modules_obarray (groups scm C) (scan-data B)) +(scm_primitive_eval (groups scm C) (scan-data T)) +(scm_primitive_eval_x (groups scm C) (scan-data T)) +(scm_primitive_exit (groups scm C) (scan-data T)) +(scm_primitive_generic_generic (groups scm C) (scan-data T)) +(scm_primitive_load (groups scm C) (scan-data T)) +(scm_primitive_load_path (groups scm C) (scan-data T)) +(scm_primitive_make_property (groups scm C) (scan-data T)) +(scm_primitive_move_to_fdes (groups scm C) (scan-data T)) +(scm_primitive_property_del_x (groups scm C) (scan-data T)) +(scm_primitive_property_ref (groups scm C) (scan-data T)) +(scm_primitive_property_set_x (groups scm C) (scan-data T)) +(scm_prin1 (groups scm C) (scan-data T)) +(scm_print_carefully_p (groups scm C) (scan-data B)) +(scm_print_complex (groups scm C) (scan-data T)) +(scm_print_options (groups scm C) (scan-data T)) +(scm_print_opts (groups scm C) (scan-data D)) +(scm_print_port_mode (groups scm C) (scan-data T)) +(scm_print_real (groups scm C) (scan-data T)) +(scm_print_state_vtable (groups scm C) (scan-data D)) +(scm_print_struct (groups scm C) (scan-data T)) +(scm_print_symbol_name (groups scm C) (scan-data T)) +(scm_printer_apply (groups scm C) (scan-data T)) +(scm_procedure (groups scm C) (scan-data T)) +(scm_procedure_documentation (groups scm C) (scan-data T)) +(scm_procedure_environment (groups scm C) (scan-data T)) +(scm_procedure_name (groups scm C) (scan-data T)) +(scm_procedure_p (groups scm C) (scan-data T)) +(scm_procedure_properties (groups scm C) (scan-data T)) +(scm_procedure_property (groups scm C) (scan-data T)) +(scm_procedure_source (groups scm C) (scan-data T)) +(scm_procedure_with_setter_p (groups scm C) (scan-data T)) +(scm_product (groups scm C) (scan-data T)) +(scm_program_arguments (groups scm C) (scan-data T)) +(scm_promise_p (groups scm C) (scan-data T)) +(scm_pseudolong (groups scm C) (scan-data T)) +(scm_ptobs (groups scm C) (scan-data B)) +(scm_ptrdiff2num (groups scm C) (scan-data T)) +(scm_putc (groups scm C) (scan-data T)) +(scm_putenv (groups scm C) (scan-data T)) +(scm_puts (groups scm C) (scan-data T)) +(scm_quotient (groups scm C) (scan-data T)) +(scm_ra2contig (groups scm C) (scan-data T)) +(scm_ra_difference (groups scm C) (scan-data T)) +(scm_ra_divide (groups scm C) (scan-data T)) +(scm_ra_eqp (groups scm C) (scan-data T)) +(scm_ra_greqp (groups scm C) (scan-data T)) +(scm_ra_grp (groups scm C) (scan-data T)) +(scm_ra_leqp (groups scm C) (scan-data T)) +(scm_ra_lessp (groups scm C) (scan-data T)) +(scm_ra_matchp (groups scm C) (scan-data T)) +(scm_ra_product (groups scm C) (scan-data T)) +(scm_ra_set_contp (groups scm C) (scan-data T)) +(scm_ra_sum (groups scm C) (scan-data T)) +(scm_raequal (groups scm C) (scan-data T)) +(scm_raise (groups scm C) (scan-data T)) +(scm_ramapc (groups scm C) (scan-data T)) +(scm_random (groups scm C) (scan-data T)) +(scm_random_exp (groups scm C) (scan-data T)) +(scm_random_hollow_sphere_x (groups scm C) (scan-data T)) +(scm_random_normal (groups scm C) (scan-data T)) +(scm_random_normal_vector_x (groups scm C) (scan-data T)) +(scm_random_solid_sphere_x (groups scm C) (scan-data T)) +(scm_random_uniform (groups scm C) (scan-data T)) +(scm_raprin1 (groups scm C) (scan-data T)) +(scm_read (groups scm C) (scan-data T)) +(scm_read_char (groups scm C) (scan-data T)) +(scm_read_delimited_x (groups scm C) (scan-data T)) +(scm_read_hash_extend (groups scm C) (scan-data T)) +(scm_read_line (groups scm C) (scan-data T)) +(scm_read_options (groups scm C) (scan-data T)) +(scm_read_opts (groups scm C) (scan-data D)) +(scm_read_string_x_partial (groups scm C) (scan-data T)) +(scm_read_token (groups scm C) (scan-data T)) +(scm_readdir (groups scm C) (scan-data T)) +(scm_readlink (groups scm C) (scan-data T)) +(scm_real_equalp (groups scm C) (scan-data T)) +(scm_real_p (groups scm C) (scan-data T)) +(scm_real_part (groups scm C) (scan-data T)) +(scm_realloc (groups scm C) (scan-data T)) +(scm_recv (groups scm C) (scan-data T)) +(scm_recvfrom (groups scm C) (scan-data T)) +(scm_redirect_port (groups scm C) (scan-data T)) +(scm_regexp_exec (groups scm C) (scan-data T)) +(scm_regexp_p (groups scm C) (scan-data T)) +(scm_release_arbiter (groups scm C) (scan-data T)) +(scm_remainder (groups scm C) (scan-data T)) +(scm_remember_upto_here (groups scm C) (scan-data T)) +(scm_remember_upto_here_1 (groups scm C) (scan-data T)) +(scm_remember_upto_here_2 (groups scm C) (scan-data T)) +(scm_remove_from_port_table (groups scm C) (scan-data T)) +(scm_remove_hook_x (groups scm C) (scan-data T)) +(scm_rename (groups scm C) (scan-data T)) +(scm_report_stack_overflow (groups scm C) (scan-data T)) +(scm_reset_hook_x (groups scm C) (scan-data T)) +(scm_resolve_module (groups scm C) (scan-data T)) +(scm_restore_signals (groups scm C) (scan-data T)) +(scm_restricted_vector_sort_x (groups scm C) (scan-data T)) +(scm_return_first (groups scm C) (scan-data T)) +(scm_return_first_int (groups scm C) (scan-data T)) +(scm_revealed_count (groups scm C) (scan-data T)) +(scm_reverse (groups scm C) (scan-data T)) +(scm_reverse_lookup (groups scm C) (scan-data T)) +(scm_reverse_x (groups scm C) (scan-data T)) +(scm_rewinddir (groups scm C) (scan-data T)) +(scm_rmdir (groups scm C) (scan-data T)) +(scm_round (groups scm C) (scan-data T)) +(scm_run_asyncs (groups scm C) (scan-data T)) +(scm_run_hook (groups scm C) (scan-data T)) +(scm_s_bindings (groups scm C) (scan-data R)) +(scm_s_body (groups scm C) (scan-data R)) +(scm_s_clauses (groups scm C) (scan-data R)) +(scm_s_duplicate_bindings (groups scm C) (scan-data R)) +(scm_s_duplicate_formals (groups scm C) (scan-data R)) +(scm_s_expression (groups scm C) (scan-data R)) +(scm_s_formals (groups scm C) (scan-data R)) +(scm_s_set_x (groups scm C) (scan-data R)) +(scm_s_slot_set_x (groups scm C) (scan-data D)) +(scm_s_test (groups scm C) (scan-data R)) +(scm_s_variable (groups scm C) (scan-data R)) +(scm_search_path (groups scm C) (scan-data T)) +(scm_seed_to_random_state (groups scm C) (scan-data T)) +(scm_seek (groups scm C) (scan-data T)) +(scm_select (groups scm C) (scan-data T)) +(scm_send (groups scm C) (scan-data T)) +(scm_sendto (groups scm C) (scan-data T)) +(scm_set_car_x (groups scm C) (scan-data T)) +(scm_set_cdr_x (groups scm C) (scan-data T)) +(scm_set_current_error_port (groups scm C) (scan-data T)) +(scm_set_current_input_port (groups scm C) (scan-data T)) +(scm_set_current_module (groups scm C) (scan-data T)) +(scm_set_current_output_port (groups scm C) (scan-data T)) +(scm_set_object_procedure_x (groups scm C) (scan-data T)) +(scm_set_object_properties_x (groups scm C) (scan-data T)) +(scm_set_object_property_x (groups scm C) (scan-data T)) +(scm_set_port_close (groups scm C) (scan-data T)) +(scm_set_port_column_x (groups scm C) (scan-data T)) +(scm_set_port_end_input (groups scm C) (scan-data T)) +(scm_set_port_equalp (groups scm C) (scan-data T)) +(scm_set_port_filename_x (groups scm C) (scan-data T)) +(scm_set_port_flush (groups scm C) (scan-data T)) +(scm_set_port_free (groups scm C) (scan-data T)) +(scm_set_port_input_waiting (groups scm C) (scan-data T)) +(scm_set_port_line_x (groups scm C) (scan-data T)) +(scm_set_port_mark (groups scm C) (scan-data T)) +(scm_set_port_print (groups scm C) (scan-data T)) +(scm_set_port_revealed_x (groups scm C) (scan-data T)) +(scm_set_port_seek (groups scm C) (scan-data T)) +(scm_set_port_truncate (groups scm C) (scan-data T)) +(scm_set_procedure_properties_x (groups scm C) (scan-data T)) +(scm_set_procedure_property_x (groups scm C) (scan-data T)) +(scm_set_program_arguments (groups scm C) (scan-data T)) +(scm_set_smob_apply (groups scm C) (scan-data T)) +(scm_set_smob_equalp (groups scm C) (scan-data T)) +(scm_set_smob_free (groups scm C) (scan-data T)) +(scm_set_smob_mark (groups scm C) (scan-data T)) +(scm_set_smob_print (groups scm C) (scan-data T)) +(scm_set_source_properties_x (groups scm C) (scan-data T)) +(scm_set_source_property_x (groups scm C) (scan-data T)) +(scm_set_struct_vtable_name_x (groups scm C) (scan-data T)) +(scm_setegid (groups scm C) (scan-data T)) +(scm_seteuid (groups scm C) (scan-data T)) +(scm_setgid (groups scm C) (scan-data T)) +(scm_setgrent (groups scm C) (scan-data T)) +(scm_sethost (groups scm C) (scan-data T)) +(scm_sethostname (groups scm C) (scan-data T)) +(scm_setitimer (groups scm C) (scan-data T)) +(scm_setlocale (groups scm C) (scan-data T)) +(scm_setnet (groups scm C) (scan-data T)) +(scm_setpgid (groups scm C) (scan-data T)) +(scm_setpriority (groups scm C) (scan-data T)) +(scm_setproto (groups scm C) (scan-data T)) +(scm_setpwent (groups scm C) (scan-data T)) +(scm_setserv (groups scm C) (scan-data T)) +(scm_setsid (groups scm C) (scan-data T)) +(scm_setsockopt (groups scm C) (scan-data T)) +(scm_setter (groups scm C) (scan-data T)) +(scm_setuid (groups scm C) (scan-data T)) +(scm_setvbuf (groups scm C) (scan-data T)) +(scm_shap2ra (groups scm C) (scan-data T)) +(scm_shared_array_increments (groups scm C) (scan-data T)) +(scm_shared_array_offset (groups scm C) (scan-data T)) +(scm_shared_array_root (groups scm C) (scan-data T)) +(scm_shell (groups scm C) (scan-data T)) +(scm_shell_usage (groups scm C) (scan-data T)) +(scm_short2num (groups scm C) (scan-data T)) +(scm_shutdown (groups scm C) (scan-data T)) +(scm_sigaction (groups scm C) (scan-data T)) +(scm_signal_condition_variable (groups scm C) (scan-data T)) +(scm_simple_format (groups scm C) (scan-data T)) +(scm_single_thread_p (groups scm C) (scan-data T)) +(scm_size2num (groups scm C) (scan-data T)) +(scm_sleep (groups scm C) (scan-data T)) +(scm_sloppy_assoc (groups scm C) (scan-data T)) +(scm_sloppy_assq (groups scm C) (scan-data T)) +(scm_sloppy_assv (groups scm C) (scan-data T)) +(scm_slot_bound_p (groups scm C) (scan-data T)) +(scm_slot_bound_using_class_p (groups scm C) (scan-data T)) +(scm_slot_exists_p (groups scm C) (scan-data T)) +(scm_slot_exists_using_class_p (groups scm C) (scan-data T)) +(scm_slot_ref (groups scm C) (scan-data T)) +(scm_slot_ref_using_class (groups scm C) (scan-data T)) +(scm_slot_set_using_class_x (groups scm C) (scan-data T)) +(scm_slot_set_x (groups scm C) (scan-data T)) +(scm_smob_class (groups scm C) (scan-data D)) +(scm_smob_free (groups scm C) (scan-data T)) +(scm_smob_prehistory (groups scm C) (scan-data T)) +(scm_smob_print (groups scm C) (scan-data T)) +(scm_smobs (groups scm C) (scan-data B)) +(scm_socket (groups scm C) (scan-data T)) +(scm_socketpair (groups scm C) (scan-data T)) +(scm_sort (groups scm C) (scan-data T)) +(scm_sort_list (groups scm C) (scan-data T)) +(scm_sort_list_x (groups scm C) (scan-data T)) +(scm_sort_x (groups scm C) (scan-data T)) +(scm_sorted_p (groups scm C) (scan-data T)) +(scm_source_properties (groups scm C) (scan-data T)) +(scm_source_property (groups scm C) (scan-data T)) +(scm_spawn_thread (groups scm C) (scan-data T)) +(scm_srcprops_to_plist (groups scm C) (scan-data T)) +(scm_stable_sort (groups scm C) (scan-data T)) +(scm_stable_sort_x (groups scm C) (scan-data T)) +(scm_stack_checking_enabled_p (groups scm C) (scan-data B)) +(scm_stack_id (groups scm C) (scan-data T)) +(scm_stack_length (groups scm C) (scan-data T)) +(scm_stack_p (groups scm C) (scan-data T)) +(scm_stack_ref (groups scm C) (scan-data T)) +(scm_stack_report (groups scm C) (scan-data T)) +(scm_stack_size (groups scm C) (scan-data T)) +(scm_stack_type (groups scm C) (scan-data B)) +(scm_standard_eval_closure (groups scm C) (scan-data T)) +(scm_standard_interface_eval_closure (groups scm C) (scan-data T)) +(scm_start_stack (groups scm C) (scan-data T)) +(scm_stat (groups scm C) (scan-data T)) +(scm_status_exit_val (groups scm C) (scan-data T)) +(scm_status_stop_sig (groups scm C) (scan-data T)) +(scm_status_term_sig (groups scm C) (scan-data T)) +(scm_str2string (groups scm C) (scan-data T)) +(scm_str2symbol (groups scm C) (scan-data T)) +(scm_strdup (groups scm C) (scan-data T)) +(scm_strerror (groups scm C) (scan-data T)) +(scm_strftime (groups scm C) (scan-data T)) +(scm_string (groups scm C) (scan-data T)) +(scm_string_append (groups scm C) (scan-data T)) +(scm_string_capitalize (groups scm C) (scan-data T)) +(scm_string_capitalize_x (groups scm C) (scan-data T)) +(scm_string_ci_equal_p (groups scm C) (scan-data T)) +(scm_string_ci_geq_p (groups scm C) (scan-data T)) +(scm_string_ci_gr_p (groups scm C) (scan-data T)) +(scm_string_ci_leq_p (groups scm C) (scan-data T)) +(scm_string_ci_less_p (groups scm C) (scan-data T)) +(scm_string_ci_to_symbol (groups scm C) (scan-data T)) +(scm_string_copy (groups scm C) (scan-data T)) +(scm_string_downcase (groups scm C) (scan-data T)) +(scm_string_downcase_x (groups scm C) (scan-data T)) +(scm_string_equal_p (groups scm C) (scan-data T)) +(scm_string_fill_x (groups scm C) (scan-data T)) +(scm_string_geq_p (groups scm C) (scan-data T)) +(scm_string_gr_p (groups scm C) (scan-data T)) +(scm_string_hash (groups scm C) (scan-data T)) +(scm_string_index (groups scm C) (scan-data T)) +(scm_string_length (groups scm C) (scan-data T)) +(scm_string_leq_p (groups scm C) (scan-data T)) +(scm_string_less_p (groups scm C) (scan-data T)) +(scm_string_null_p (groups scm C) (scan-data T)) +(scm_string_p (groups scm C) (scan-data T)) +(scm_string_ref (groups scm C) (scan-data T)) +(scm_string_rindex (groups scm C) (scan-data T)) +(scm_string_set_x (groups scm C) (scan-data T)) +(scm_string_split (groups scm C) (scan-data T)) +(scm_string_to_list (groups scm C) (scan-data T)) +(scm_string_to_number (groups scm C) (scan-data T)) +(scm_string_to_symbol (groups scm C) (scan-data T)) +(scm_string_upcase (groups scm C) (scan-data T)) +(scm_string_upcase_x (groups scm C) (scan-data T)) +(scm_strndup (groups scm C) (scan-data T)) +(scm_strport_to_string (groups scm C) (scan-data T)) +(scm_strptime (groups scm C) (scan-data T)) +(scm_struct_create_handle (groups scm C) (scan-data T)) +(scm_struct_free_0 (groups scm C) (scan-data T)) +(scm_struct_free_entity (groups scm C) (scan-data T)) +(scm_struct_free_light (groups scm C) (scan-data T)) +(scm_struct_free_standard (groups scm C) (scan-data T)) +(scm_struct_ihashq (groups scm C) (scan-data T)) +(scm_struct_p (groups scm C) (scan-data T)) +(scm_struct_prehistory (groups scm C) (scan-data T)) +(scm_struct_ref (groups scm C) (scan-data T)) +(scm_struct_set_x (groups scm C) (scan-data T)) +(scm_struct_table (groups scm C) (scan-data B)) +(scm_struct_vtable (groups scm C) (scan-data T)) +(scm_struct_vtable_name (groups scm C) (scan-data T)) +(scm_struct_vtable_p (groups scm C) (scan-data T)) +(scm_struct_vtable_tag (groups scm C) (scan-data T)) +(scm_structs_to_free (groups scm C) (scan-data B)) +(scm_subr_p (groups scm C) (scan-data T)) +(scm_subr_table (groups scm C) (scan-data B)) +(scm_subr_table_room (groups scm C) (scan-data D)) +(scm_subr_table_size (groups scm C) (scan-data D)) +(scm_substring (groups scm C) (scan-data T)) +(scm_substring_fill_x (groups scm C) (scan-data T)) +(scm_substring_move_x (groups scm C) (scan-data T)) +(scm_sum (groups scm C) (scan-data T)) +(scm_swap_bindings (groups scm C) (scan-data T)) +(scm_swap_fluids (groups scm C) (scan-data T)) +(scm_swap_fluids_reverse (groups scm C) (scan-data T)) +(scm_switch_counter (groups scm C) (scan-data D)) +(scm_sym2var (groups scm C) (scan-data T)) +(scm_sym_and (groups scm C) (scan-data B)) +(scm_sym_apply (groups scm C) (scan-data B)) +(scm_sym_apply_frame (groups scm C) (scan-data B)) +(scm_sym_arity (groups scm C) (scan-data B)) +(scm_sym_arrow (groups scm C) (scan-data B)) +(scm_sym_at_call_with_values (groups scm C) (scan-data B)) +(scm_sym_atapply (groups scm C) (scan-data B)) +(scm_sym_atcall_cc (groups scm C) (scan-data B)) +(scm_sym_begin (groups scm C) (scan-data B)) +(scm_sym_breakpoint (groups scm C) (scan-data B)) +(scm_sym_case (groups scm C) (scan-data B)) +(scm_sym_column (groups scm C) (scan-data B)) +(scm_sym_cond (groups scm C) (scan-data B)) +(scm_sym_copy (groups scm C) (scan-data B)) +(scm_sym_define (groups scm C) (scan-data B)) +(scm_sym_delay (groups scm C) (scan-data B)) +(scm_sym_do (groups scm C) (scan-data B)) +(scm_sym_dot (groups scm C) (scan-data B)) +(scm_sym_else (groups scm C) (scan-data B)) +(scm_sym_enter_frame (groups scm C) (scan-data B)) +(scm_sym_exit_frame (groups scm C) (scan-data B)) +(scm_sym_filename (groups scm C) (scan-data B)) +(scm_sym_if (groups scm C) (scan-data B)) +(scm_sym_lambda (groups scm C) (scan-data B)) +(scm_sym_let (groups scm C) (scan-data B)) +(scm_sym_letrec (groups scm C) (scan-data B)) +(scm_sym_letstar (groups scm C) (scan-data B)) +(scm_sym_line (groups scm C) (scan-data B)) +(scm_sym_name (groups scm C) (scan-data B)) +(scm_sym_or (groups scm C) (scan-data B)) +(scm_sym_quasiquote (groups scm C) (scan-data B)) +(scm_sym_quote (groups scm C) (scan-data B)) +(scm_sym_set_x (groups scm C) (scan-data B)) +(scm_sym_system_procedure (groups scm C) (scan-data B)) +(scm_sym_trace (groups scm C) (scan-data B)) +(scm_sym_unquote (groups scm C) (scan-data B)) +(scm_sym_uq_splicing (groups scm C) (scan-data B)) +(scm_symbol_fref (groups scm C) (scan-data T)) +(scm_symbol_fset_x (groups scm C) (scan-data T)) +(scm_symbol_hash (groups scm C) (scan-data T)) +(scm_symbol_interned_p (groups scm C) (scan-data T)) +(scm_symbol_p (groups scm C) (scan-data T)) +(scm_symbol_pref (groups scm C) (scan-data T)) +(scm_symbol_pset_x (groups scm C) (scan-data T)) +(scm_symbol_to_string (groups scm C) (scan-data T)) +(scm_symbols_prehistory (groups scm C) (scan-data T)) +(scm_symlink (groups scm C) (scan-data T)) +(scm_sync (groups scm C) (scan-data T)) +(scm_sys_allocate_instance (groups scm C) (scan-data T)) +(scm_sys_atan2 (groups scm C) (scan-data T)) +(scm_sys_compute_applicable_methods (groups scm C) (scan-data T)) +(scm_sys_compute_slots (groups scm C) (scan-data T)) +(scm_sys_expt (groups scm C) (scan-data T)) +(scm_sys_fast_slot_ref (groups scm C) (scan-data T)) +(scm_sys_fast_slot_set_x (groups scm C) (scan-data T)) +(scm_sys_inherit_magic_x (groups scm C) (scan-data T)) +(scm_sys_initialize_object (groups scm C) (scan-data T)) +(scm_sys_invalidate_class (groups scm C) (scan-data T)) +(scm_sys_invalidate_method_cache_x (groups scm C) (scan-data T)) +(scm_sys_library_dir (groups scm C) (scan-data T)) +(scm_sys_make_void_port (groups scm C) (scan-data T)) +(scm_sys_method_more_specific_p (groups scm C) (scan-data T)) +(scm_sys_modify_class (groups scm C) (scan-data T)) +(scm_sys_modify_instance (groups scm C) (scan-data T)) +(scm_sys_package_data_dir (groups scm C) (scan-data T)) +(scm_sys_prep_layout_x (groups scm C) (scan-data T)) +(scm_sys_protects (groups scm C) (scan-data B)) +(scm_sys_search_load_path (groups scm C) (scan-data T)) +(scm_sys_set_object_setter_x (groups scm C) (scan-data T)) +(scm_sys_site_dir (groups scm C) (scan-data T)) +(scm_sys_tag_body (groups scm C) (scan-data T)) +(scm_syserror (groups scm C) (scan-data T)) +(scm_syserror_msg (groups scm C) (scan-data T)) +(scm_system (groups scm C) (scan-data T)) +(scm_system_async (groups scm C) (scan-data T)) +(scm_system_async_mark (groups scm C) (scan-data T)) +(scm_system_async_mark_from_signal_handler (groups scm C) (scan-data T)) +(scm_system_environment (groups scm C) (scan-data B)) +(scm_system_error_key (groups scm C) (scan-data B)) +(scm_system_module_env_p (groups scm C) (scan-data T)) +(scm_tables_prehistory (groups scm C) (scan-data T)) +(scm_take0str (groups scm C) (scan-data T)) +(scm_take_from_input_buffers (groups scm C) (scan-data T)) +(scm_take_str (groups scm C) (scan-data T)) +(scm_tc16_allocated (groups scm C) (scan-data B)) +(scm_tc16_array (groups scm C) (scan-data B)) +(scm_tc16_condvar (groups scm C) (scan-data B)) +(scm_tc16_continuation (groups scm C) (scan-data B)) +(scm_tc16_debugobj (groups scm C) (scan-data B)) +(scm_tc16_dir (groups scm C) (scan-data B)) +(scm_tc16_dynamic_obj (groups scm C) (scan-data B)) +(scm_tc16_environment (groups scm C) (scan-data B)) +(scm_tc16_eval_closure (groups scm C) (scan-data B)) +(scm_tc16_fluid (groups scm C) (scan-data B)) +(scm_tc16_fport (groups scm C) (scan-data B)) +(scm_tc16_hook (groups scm C) (scan-data B)) +(scm_tc16_keyword (groups scm C) (scan-data B)) +(scm_tc16_macro (groups scm C) (scan-data B)) +(scm_tc16_malloc (groups scm C) (scan-data B)) +(scm_tc16_memoized (groups scm C) (scan-data B)) +(scm_tc16_mutex (groups scm C) (scan-data B)) +(scm_tc16_observer (groups scm C) (scan-data B)) +(scm_tc16_port_with_ps (groups scm C) (scan-data B)) +(scm_tc16_promise (groups scm C) (scan-data B)) +(scm_tc16_regex (groups scm C) (scan-data B)) +(scm_tc16_root (groups scm C) (scan-data B)) +(scm_tc16_rstate (groups scm C) (scan-data B)) +(scm_tc16_srcprops (groups scm C) (scan-data B)) +(scm_tc16_strport (groups scm C) (scan-data B)) +(scm_tc16_thread (groups scm C) (scan-data B)) +(scm_tc16_void_port (groups scm C) (scan-data D)) +(scm_tcgetpgrp (groups scm C) (scan-data T)) +(scm_tcsetpgrp (groups scm C) (scan-data T)) +(scm_the_last_stack_fluid_var (groups scm C) (scan-data B)) +(scm_the_rng (groups scm C) (scan-data B)) +(scm_thread_count (groups scm C) (scan-data D)) +(scm_thread_sleep (groups scm C) (scan-data T)) +(scm_thread_usleep (groups scm C) (scan-data T)) +(scm_threads_init (groups scm C) (scan-data T)) +(scm_threads_mark_stacks (groups scm C) (scan-data T)) +(scm_throw (groups scm C) (scan-data T)) +(scm_thunk_p (groups scm C) (scan-data T)) +(scm_times (groups scm C) (scan-data T)) +(scm_tmpnam (groups scm C) (scan-data T)) +(scm_top_level_env (groups scm C) (scan-data T)) +(scm_transpose_array (groups scm C) (scan-data T)) +(scm_truncate (groups scm C) (scan-data T)) +(scm_truncate_file (groups scm C) (scan-data T)) +(scm_try_arbiter (groups scm C) (scan-data T)) +(scm_ttyname (groups scm C) (scan-data T)) +(scm_type_eval_environment (groups scm C) (scan-data D)) +(scm_type_export_environment (groups scm C) (scan-data D)) +(scm_type_import_environment (groups scm C) (scan-data D)) +(scm_type_leaf_environment (groups scm C) (scan-data D)) +(scm_tzset (groups scm C) (scan-data T)) +(scm_uint2num (groups scm C) (scan-data T)) +(scm_ulong2num (groups scm C) (scan-data T)) +(scm_ulong_long2num (groups scm C) (scan-data T)) +(scm_umask (groups scm C) (scan-data T)) +(scm_uname (groups scm C) (scan-data T)) +(scm_ungetc (groups scm C) (scan-data T)) +(scm_ungets (groups scm C) (scan-data T)) +(scm_uniform_array_read_x (groups scm C) (scan-data T)) +(scm_uniform_array_write (groups scm C) (scan-data T)) +(scm_uniform_element_size (groups scm C) (scan-data T)) +(scm_uniform_vector_length (groups scm C) (scan-data T)) +(scm_uniform_vector_ref (groups scm C) (scan-data T)) +(scm_unlock_mutex (groups scm C) (scan-data T)) +(scm_unmask_signals (groups scm C) (scan-data T)) +(scm_unmemocar (groups scm C) (scan-data T)) +(scm_unmemocopy (groups scm C) (scan-data T)) +(scm_unmemoize (groups scm C) (scan-data T)) +(scm_unread_char (groups scm C) (scan-data T)) +(scm_unread_string (groups scm C) (scan-data T)) +(scm_upcase (groups scm C) (scan-data T)) +(scm_usage_name (groups scm C) (scan-data D)) +(scm_ushort2num (groups scm C) (scan-data T)) +(scm_usleep (groups scm C) (scan-data T)) +(scm_utime (groups scm C) (scan-data T)) +(scm_valid_object_procedure_p (groups scm C) (scan-data T)) +(scm_valid_oport_value_p (groups scm C) (scan-data T)) +(scm_values (groups scm C) (scan-data T)) +(scm_values_vtable (groups scm C) (scan-data B)) +(scm_var_random_state (groups scm C) (scan-data B)) +(scm_variable_bound_p (groups scm C) (scan-data T)) +(scm_variable_p (groups scm C) (scan-data T)) +(scm_variable_ref (groups scm C) (scan-data T)) +(scm_variable_set_x (groups scm C) (scan-data T)) +(scm_vector (groups scm C) (scan-data T)) +(scm_vector_equal_p (groups scm C) (scan-data T)) +(scm_vector_fill_x (groups scm C) (scan-data T)) +(scm_vector_length (groups scm C) (scan-data T)) +(scm_vector_move_left_x (groups scm C) (scan-data T)) +(scm_vector_move_right_x (groups scm C) (scan-data T)) +(scm_vector_p (groups scm C) (scan-data T)) +(scm_vector_ref (groups scm C) (scan-data T)) +(scm_vector_set_x (groups scm C) (scan-data T)) +(scm_vector_to_list (groups scm C) (scan-data T)) +(scm_version (groups scm C) (scan-data T)) +(scm_void_port (groups scm C) (scan-data T)) +(scm_wait_condition_variable (groups scm C) (scan-data T)) +(scm_waitpid (groups scm C) (scan-data T)) +(scm_weak_key_hash_table_p (groups scm C) (scan-data T)) +(scm_weak_value_hash_table_p (groups scm C) (scan-data T)) +(scm_weak_vector (groups scm C) (scan-data T)) +(scm_weak_vector_p (groups scm C) (scan-data T)) +(scm_weak_vectors (groups scm C) (scan-data B)) +(scm_weaks_prehistory (groups scm C) (scan-data T)) +(scm_with_fluids (groups scm C) (scan-data T)) +(scm_with_traps (groups scm C) (scan-data T)) +(scm_wrap_component (groups scm C) (scan-data T)) +(scm_wrap_object (groups scm C) (scan-data T)) +(scm_write (groups scm C) (scan-data T)) +(scm_write_char (groups scm C) (scan-data T)) +(scm_write_line (groups scm C) (scan-data T)) +(scm_write_string_partial (groups scm C) (scan-data T)) +(scm_wrong_num_args (groups scm C) (scan-data T)) +(scm_wrong_type_arg (groups scm C) (scan-data T)) +(scm_wrong_type_arg_msg (groups scm C) (scan-data T)) +(scm_yield (groups scm C) (scan-data T)) +(scm_your_base (groups scm C) (scan-data D)) +(scm_zero_p (groups scm C) (scan-data T)) +(search-path (groups Scheme) (scan-data "#")) +(seed->random-state (groups Scheme) (scan-data "#random-state>")) +(seek (groups Scheme) (scan-data "#")) +(select (groups POSIX Scheme) (scan-data "#")) +(send (groups Scheme) (scan-data "#")) +(sendto (groups Scheme) (scan-data "#")) +(servent:aliases (groups Scheme) (scan-data "#")) +(servent:name (groups Scheme) (scan-data "#")) +(servent:port (groups Scheme) (scan-data "#")) +(servent:proto (groups Scheme) (scan-data "#")) +(set! (groups Scheme) (scan-data "")) +(set-autoloaded! (groups Scheme) (scan-data "#")) +(set-batch-mode?! (groups Scheme) (scan-data "#")) +(set-car! (groups Scheme) (scan-data "#")) +(set-cdr! (groups Scheme) (scan-data "#")) +(set-current-error-port (groups Scheme) (scan-data "#")) +(set-current-input-port (groups Scheme) (scan-data "#")) +(set-current-module (groups Scheme) (scan-data "#")) +(set-current-output-port (groups Scheme) (scan-data "#")) +(set-defmacro-transformer! (groups Scheme) (scan-data "#")) +(set-module-binder! (groups Scheme) (scan-data "#")) +(set-module-eval-closure! (groups Scheme) (scan-data "#")) +(set-module-kind! (groups Scheme) (scan-data "#")) +(set-module-name! (groups Scheme) (scan-data "#")) +(set-module-obarray! (groups Scheme) (scan-data "#")) +(set-module-observer-id! (groups Scheme) (scan-data "#")) +(set-module-observers! (groups Scheme) (scan-data "#")) +(set-module-public-interface! (groups Scheme) (scan-data "#")) +(set-module-transformer! (groups Scheme) (scan-data "#")) +(set-module-uses! (groups Scheme) (scan-data "#")) +(set-object-procedure! (groups Scheme) (scan-data "#")) +(set-object-properties! (groups Scheme) (scan-data "#")) +(set-object-property! (groups Scheme) (scan-data "#")) +(set-port-column! (groups Scheme) (scan-data "#")) +(set-port-filename! (groups Scheme) (scan-data "#")) +(set-port-line! (groups Scheme) (scan-data "#")) +(set-port-revealed! (groups POSIX Scheme) (scan-data "#")) +(set-procedure-properties! (groups Scheme) (scan-data "#")) +(set-procedure-property! (groups Scheme) (scan-data "#")) +(set-repl-prompt! (groups Scheme) (scan-data "#")) +(set-source-properties! (groups Scheme) (scan-data "#")) +(set-source-property! (groups Scheme) (scan-data "#")) +(set-struct-vtable-name! (groups Scheme) (scan-data "#")) +(set-symbol-property! (groups Scheme) (scan-data "#")) +(set-system-module! (groups Scheme) (scan-data "#")) +(set-tm:gmtoff (groups POSIX Scheme) (scan-data "#")) +(set-tm:hour (groups POSIX Scheme) (scan-data "#")) +(set-tm:isdst (groups POSIX Scheme) (scan-data "#")) +(set-tm:mday (groups POSIX Scheme) (scan-data "#")) +(set-tm:min (groups POSIX Scheme) (scan-data "#")) +(set-tm:mon (groups POSIX Scheme) (scan-data "#")) +(set-tm:sec (groups POSIX Scheme) (scan-data "#")) +(set-tm:wday (groups POSIX Scheme) (scan-data "#")) +(set-tm:yday (groups POSIX Scheme) (scan-data "#")) +(set-tm:year (groups POSIX Scheme) (scan-data "#")) +(set-tm:zone (groups POSIX Scheme) (scan-data "#")) +(setegid (groups POSIX Scheme) (scan-data "#")) +(setenv (groups POSIX Scheme) (scan-data "#")) +(seteuid (groups POSIX Scheme) (scan-data "#")) +(setgid (groups POSIX Scheme) (scan-data "#")) +(setgr (groups POSIX Scheme) (scan-data "#")) +(setgrent (groups POSIX Scheme) (scan-data "#")) +(sethost (groups Scheme) (scan-data "#")) +(sethostent (groups Scheme) (scan-data "#")) +(sethostname (groups POSIX Scheme) (scan-data "#")) +(setitimer (groups POSIX Scheme) (scan-data "#")) +(setlocale (groups POSIX Scheme) (scan-data "#")) +(setnet (groups Scheme) (scan-data "#")) +(setnetent (groups Scheme) (scan-data "#")) +(setpgid (groups POSIX Scheme) (scan-data "#")) +(setpriority (groups POSIX Scheme) (scan-data "#")) +(setproto (groups Scheme) (scan-data "#")) +(setprotoent (groups Scheme) (scan-data "#")) +(setpw (groups POSIX Scheme) (scan-data "#")) +(setpwent (groups POSIX Scheme) (scan-data "#")) +(setserv (groups Scheme) (scan-data "#")) +(setservent (groups Scheme) (scan-data "#")) +(setsid (groups POSIX Scheme) (scan-data "#")) +(setsockopt (groups Scheme) (scan-data "#")) +(setter (groups Scheme) (scan-data "#")) +(setuid (groups POSIX Scheme) (scan-data "#")) +(setvbuf (groups POSIX Scheme) (scan-data "#")) +(shared-array-increments (groups Scheme) (scan-data "#")) +(shared-array-offset (groups Scheme) (scan-data "#")) +(shared-array-root (groups Scheme) (scan-data "#")) +(shutdown (groups Scheme) (scan-data "#")) +(sigaction (groups POSIX Scheme) (scan-data "#")) +(signal-condition-variable (groups Scheme) (scan-data "#")) +(signal-handlers (groups Scheme) (scan-data "")) +(simple-format (groups Scheme) (scan-data "#")) +(sin (groups Scheme) (scan-data "#")) +(single-active-thread? (groups Scheme) (scan-data "#")) +(sinh (groups Scheme) (scan-data "#")) +(sleep (groups POSIX Scheme) (scan-data "#")) +(sloppy-assoc (groups Scheme) (scan-data "#")) +(sloppy-assq (groups Scheme) (scan-data "#")) +(sloppy-assv (groups Scheme) (scan-data "#")) +(sockaddr:addr (groups Scheme) (scan-data "#")) +(sockaddr:fam (groups Scheme) (scan-data "#")) +(sockaddr:path (groups Scheme) (scan-data "#")) +(sockaddr:port (groups Scheme) (scan-data "#")) +(socket (groups Scheme) (scan-data "#")) +(socketpair (groups Scheme) (scan-data "#")) +(sort (groups Scheme) (scan-data "#")) +(sort! (groups Scheme) (scan-data "#")) +(sort-list (groups Scheme) (scan-data "#")) +(sort-list! (groups Scheme) (scan-data "#")) +(sorted? (groups Scheme) (scan-data "#")) +(source-properties (groups Scheme) (scan-data "#")) +(source-property (groups Scheme) (scan-data "#")) +(source-whash (groups Scheme) (scan-data "")) +(sqrt (groups Scheme) (scan-data "#")) +(stable-sort (groups Scheme) (scan-data "#")) +(stable-sort! (groups Scheme) (scan-data "#")) +(stack-id (groups Scheme) (scan-data "#")) +(stack-length (groups Scheme) (scan-data "#")) +(stack-ref (groups Scheme) (scan-data "#")) +(stack-saved? (groups Scheme) (scan-data "")) +(stack? (groups Scheme) (scan-data "#")) +(standard-eval-closure (groups Scheme) (scan-data "#")) +(standard-interface-eval-closure (groups Scheme) (scan-data "#")) +(start-stack (groups Scheme) (scan-data "")) +(stat (groups POSIX Scheme) (scan-data "#")) +(stat:atime (groups POSIX Scheme) (scan-data "#")) +(stat:blksize (groups POSIX Scheme) (scan-data "#")) +(stat:blocks (groups POSIX Scheme) (scan-data "#")) +(stat:ctime (groups POSIX Scheme) (scan-data "#")) +(stat:dev (groups POSIX Scheme) (scan-data "#")) +(stat:gid (groups POSIX Scheme) (scan-data "#")) +(stat:ino (groups POSIX Scheme) (scan-data "#")) +(stat:mode (groups POSIX Scheme) (scan-data "#")) +(stat:mtime (groups POSIX Scheme) (scan-data "#")) +(stat:nlink (groups POSIX Scheme) (scan-data "#")) +(stat:perms (groups POSIX Scheme) (scan-data "#")) +(stat:rdev (groups POSIX Scheme) (scan-data "#")) +(stat:size (groups POSIX Scheme) (scan-data "#")) +(stat:type (groups POSIX Scheme) (scan-data "#")) +(stat:uid (groups POSIX Scheme) (scan-data "#")) +(status:exit-val (groups POSIX Scheme) (scan-data "#")) +(status:stop-sig (groups POSIX Scheme) (scan-data "#")) +(status:term-sig (groups POSIX Scheme) (scan-data "#")) +(strerror (groups Scheme) (scan-data "#")) +(strftime (groups POSIX Scheme) (scan-data "#")) +(string (groups Scheme) (scan-data "#")) +(string->list (groups Scheme) (scan-data "#list>")) +(string->number (groups Scheme) (scan-data "#number>")) +(string->symbol (groups Scheme) (scan-data "#symbol>")) +(string-append (groups Scheme) (scan-data "#")) +(string-capitalize (groups Scheme) (scan-data "#")) +(string-capitalize! (groups Scheme) (scan-data "#")) +(string-ci->symbol (groups Scheme) (scan-data "#symbol>")) +(string-ci<=? (groups Scheme) (scan-data "#")) +(string-ci")) +(string-ci=? (groups Scheme) (scan-data "#")) +(string-ci>=? (groups Scheme) (scan-data "#=?>")) +(string-ci>? (groups Scheme) (scan-data "#?>")) +(string-copy (groups Scheme) (scan-data "#")) +(string-downcase (groups Scheme) (scan-data "#")) +(string-downcase! (groups Scheme) (scan-data "#")) +(string-fill! (groups Scheme) (scan-data "#")) +(string-index (groups Scheme) (scan-data "#")) +(string-length (groups Scheme) (scan-data "#")) +(string-null? (groups Scheme) (scan-data "#")) +(string-ref (groups Scheme) (scan-data "#")) +(string-rindex (groups Scheme) (scan-data "#")) +(string-set! (groups Scheme) (scan-data "#")) +(string-split (groups Scheme) (scan-data "#")) +(string-upcase (groups Scheme) (scan-data "#")) +(string-upcase! (groups Scheme) (scan-data "#")) +(string<=? (groups Scheme) (scan-data "#")) +(string")) +(string=? (groups Scheme) (scan-data "#")) +(string>=? (groups Scheme) (scan-data "#=?>")) +(string>? (groups Scheme) (scan-data "#?>")) +(string? (groups Scheme) (scan-data "#")) +(strptime (groups POSIX Scheme) (scan-data "#")) +(struct-layout (groups Scheme) (scan-data "#")) +(struct-ref (groups Scheme) (scan-data "#")) +(struct-set! (groups Scheme) (scan-data "#")) +(struct-vtable (groups Scheme) (scan-data "#")) +(struct-vtable-name (groups Scheme) (scan-data "#")) +(struct-vtable-tag (groups Scheme) (scan-data "#")) +(struct-vtable? (groups Scheme) (scan-data "#")) +(struct? (groups Scheme) (scan-data "#")) +(substring (groups Scheme) (scan-data "#")) +(substring-fill! (groups Scheme) (scan-data "#")) +(substring-move! (groups Scheme) (scan-data "#")) +(symbol (groups Scheme) (scan-data "#")) +(symbol->keyword (groups Scheme) (scan-data "#keyword (symbol)>")) +(symbol->string (groups Scheme) (scan-data "#string>")) +(symbol-append (groups Scheme) (scan-data "#")) +(symbol-fref (groups Scheme) (scan-data "#")) +(symbol-fset! (groups Scheme) (scan-data "#")) +(symbol-hash (groups Scheme) (scan-data "#")) +(symbol-interned? (groups Scheme) (scan-data "#")) +(symbol-pref (groups Scheme) (scan-data "#")) +(symbol-prefix-proc (groups Scheme) (scan-data "#")) +(symbol-property (groups Scheme) (scan-data "#")) +(symbol-property-remove! (groups Scheme) (scan-data "#")) +(symbol-pset! (groups Scheme) (scan-data "#")) +(symbol? (groups Scheme) (scan-data "#")) +(symlink (groups POSIX Scheme) (scan-data "#")) +(sync (groups POSIX Scheme) (scan-data "#")) +(system (groups POSIX Scheme) (scan-data "#")) +(system-async (groups Scheme) (scan-data "#")) +(system-async-mark (groups Scheme) (scan-data "#")) +(system-error-errno (groups Scheme) (scan-data "#")) +(tan (groups Scheme) (scan-data "#")) +(tanh (groups Scheme) (scan-data "#")) +(tcgetpgrp (groups POSIX Scheme) (scan-data "#")) +(tcsetpgrp (groups POSIX Scheme) (scan-data "#")) +(the-environment (groups Scheme) (scan-data "")) +(the-eof-object (groups Scheme) (scan-data "")) +(the-last-stack (groups Scheme) (scan-data "")) +(the-root-environment (groups Scheme) (scan-data "")) +(the-root-module (groups Scheme) (scan-data "")) +(the-scm-module (groups Scheme) (scan-data "")) +(throw (groups Scheme) (scan-data "#")) +(thunk? (groups Scheme) (scan-data "#")) +(times (groups POSIX Scheme) (scan-data "#")) +(tm:gmtoff (groups POSIX Scheme) (scan-data "#")) +(tm:hour (groups POSIX Scheme) (scan-data "#")) +(tm:isdst (groups POSIX Scheme) (scan-data "#")) +(tm:mday (groups POSIX Scheme) (scan-data "#")) +(tm:min (groups POSIX Scheme) (scan-data "#")) +(tm:mon (groups POSIX Scheme) (scan-data "#")) +(tm:sec (groups POSIX Scheme) (scan-data "#")) +(tm:wday (groups POSIX Scheme) (scan-data "#")) +(tm:yday (groups POSIX Scheme) (scan-data "#")) +(tm:year (groups POSIX Scheme) (scan-data "#")) +(tm:zone (groups POSIX Scheme) (scan-data "#")) +(tmpnam (groups POSIX Scheme) (scan-data "#")) +(tms:clock (groups POSIX Scheme) (scan-data "#")) +(tms:cstime (groups POSIX Scheme) (scan-data "#")) +(tms:cutime (groups POSIX Scheme) (scan-data "#")) +(tms:stime (groups POSIX Scheme) (scan-data "#")) +(tms:utime (groups POSIX Scheme) (scan-data "#")) +(top-repl (groups Scheme) (scan-data "#")) +(transform-usage-lambda (groups Scheme) (scan-data "#")) +(transpose-array (groups Scheme) (scan-data "#")) +(trap-disable (groups Scheme) (scan-data "#")) +(trap-enable (groups Scheme) (scan-data "#")) +(trap-set! (groups Scheme) (scan-data "")) +(traps (groups Scheme) (scan-data "#")) +(truncate (groups Scheme) (scan-data "#")) +(truncate-file (groups Scheme) (scan-data "#")) +(try-arbiter (groups Scheme) (scan-data "#")) +(try-load-module (groups Scheme) (scan-data "#")) +(try-module-autoload (groups Scheme) (scan-data "#")) +(ttyname (groups POSIX Scheme) (scan-data "#")) +(turn-on-debugging (groups Scheme) (scan-data "#")) +(tzset (groups POSIX Scheme) (scan-data "#")) +(umask (groups POSIX Scheme) (scan-data "#")) +(uname (groups POSIX Scheme) (scan-data "#")) +(undefine (groups Scheme) (scan-data "")) +(uniform-array-read! (groups Scheme) (scan-data "#")) +(uniform-array-set1! (groups Scheme) (scan-data "#")) +(uniform-array-write (groups Scheme) (scan-data "#")) +(uniform-vector-fill! (groups Scheme) (scan-data "#")) +(uniform-vector-length (groups Scheme) (scan-data "#")) +(uniform-vector-read! (groups Scheme) (scan-data "#")) +(uniform-vector-ref (groups Scheme) (scan-data "#")) +(uniform-vector-set! (groups Scheme) (scan-data "#")) +(uniform-vector-write (groups Scheme) (scan-data "#")) +(uniform-vector? (groups Scheme) (scan-data "#")) +(unlock-mutex (groups Scheme) (scan-data "#")) +(unmask-signals (groups Scheme) (scan-data "#")) +(unmemoize (groups Scheme) (scan-data "#")) +(unread-char (groups POSIX Scheme) (scan-data "#")) +(unread-string (groups POSIX Scheme) (scan-data "#")) +(unsetenv (groups Scheme) (scan-data "#")) +(unspecified? (groups Scheme) (scan-data "#")) +(use-emacs-interface (groups Scheme) (scan-data "")) +(use-modules (groups Scheme) (scan-data "")) +(use-srfis (groups Scheme) (scan-data "#")) +(use-syntax (groups Scheme) (scan-data "")) +(using-readline? (groups Scheme) (scan-data "#")) +(usleep (groups POSIX Scheme) (scan-data "#")) +(utime (groups POSIX Scheme) (scan-data "#")) +(utsname:machine (groups POSIX Scheme) (scan-data "#")) +(utsname:nodename (groups POSIX Scheme) (scan-data "#")) +(utsname:release (groups POSIX Scheme) (scan-data "#")) +(utsname:sysname (groups POSIX Scheme) (scan-data "#")) +(utsname:version (groups POSIX Scheme) (scan-data "#")) +(valid-object-procedure? (groups Scheme) (scan-data "#")) +(values (groups Scheme) (scan-data "#")) +(variable-bound? (groups Scheme) (scan-data "#")) +(variable-ref (groups Scheme) (scan-data "#")) +(variable-set! (groups Scheme) (scan-data "#")) +(variable? (groups Scheme) (scan-data "#")) +(vector (groups Scheme) (scan-data "#")) +(vector->list (groups Scheme) (scan-data "#list>")) +(vector-fill! (groups Scheme) (scan-data "#")) +(vector-length (groups Scheme) (scan-data "#")) +(vector-move-left! (groups Scheme) (scan-data "#")) +(vector-move-right! (groups Scheme) (scan-data "#")) +(vector-ref (groups Scheme) (scan-data "#")) +(vector-set! (groups Scheme) (scan-data "#")) +(vector? (groups Scheme) (scan-data "#")) +(version (groups Scheme) (scan-data "#")) +(vtable-index-layout (groups Scheme) (scan-data "")) +(vtable-index-printer (groups Scheme) (scan-data "")) +(vtable-index-vtable (groups Scheme) (scan-data "")) +(vtable-offset-user (groups Scheme) (scan-data "")) +(wait-condition-variable (groups Scheme) (scan-data "#")) +(waitpid (groups POSIX Scheme) (scan-data "#")) +(warn (groups Scheme) (scan-data "#")) +(weak-key-hash-table? (groups Scheme) (scan-data "#")) +(weak-value-hash-table? (groups Scheme) (scan-data "#")) +(weak-vector (groups Scheme) (scan-data "#")) +(weak-vector? (groups Scheme) (scan-data "#")) +(while (groups Scheme) (scan-data "")) +(with-error-to-file (groups Scheme) (scan-data "#")) +(with-error-to-port (groups Scheme) (scan-data "#")) +(with-error-to-string (groups Scheme) (scan-data "#")) +(with-fluids (groups Scheme) (scan-data "")) +(with-fluids* (groups Scheme) (scan-data "#")) +(with-input-from-file (groups Scheme) (scan-data "#")) +(with-input-from-port (groups Scheme) (scan-data "#")) +(with-input-from-string (groups Scheme) (scan-data "#")) +(with-output-to-file (groups Scheme) (scan-data "#")) +(with-output-to-port (groups Scheme) (scan-data "#")) +(with-output-to-string (groups Scheme) (scan-data "#")) +(with-traps (groups Scheme) (scan-data "#")) +(write (groups Scheme) (scan-data "#")) +(write-char (groups Scheme) (scan-data "#")) +(xformer-table (groups Scheme) (scan-data "")) +(yield (groups Scheme) (scan-data "#")) +(zero? (groups Scheme) (scan-data "#")) +) ;; end of interface +) ;; eof diff --git a/guile18/doc/guile.1 b/guile18/doc/guile.1 new file mode 100644 index 0000000000..46ea952990 --- /dev/null +++ b/guile18/doc/guile.1 @@ -0,0 +1,99 @@ +.\" Written by Robert Merkel (rgmerk@mira.net) +.\" augmented by Rob Browning +.\" Process this file with +.\" groff -man -Tascii foo.1 +.\" +.TH GUILE 1 +.SH NAME +guile \- a Scheme interpreter +.SH SYNOPSIS +.B guile [-q] [-ds] [--help] [--version] [--emacs] [--debug] +.B [-l FILE] [-e FUNCTION] [\] +.B [-c EXPR] [-s SCRIPT] [--] +.SH DESCRIPTION +GNU Guile is an interpreter for the Scheme programming language. It +implements R5RS, providing additional features +necessary for real-world use. It is extremely simple to embed guile +into a C program, calling C from Scheme and Scheme from C. Guile's +design makes it very suitable for use as an "extension" or "glue" +language, but it also works well as a stand-alone scheme development +environment. + +The +.B guile +executable itself provides a stand-alone interpreter for scheme +programs, for either interactive use or executing scripts. + +This manpage provides only brief instruction in invoking +.B guile +from the command line. Please consult the guile info documentation +(type +.B info guile +at a command prompt) for more information. There is also a tutorial +.B (info guile-tut) +available. + +.SH OPTIONS +.IP -l FILE +Load scheme source code from file. +.IP -e FUNCTION +After reading script, apply FUNCTION to command-line arguments +.IP -ds +do -s SCRIPT at this point (note that this argument must be used in +conjuction with -s) +.IP --help +Describe command line options and exit +.IP --debug +Start guile with debugging evaluator and backtraces enabled +(useful for debugging guile scripts) +.IP --version +Display guile version and exit. +.IP --emacs +Enable emacs protocol for use from within emacs (experimental) +.IP -- +Stop argument processing, start guile in interactive mode. +.IP -c EXPR +Stop argument processing, evaluate EXPR as a scheme expression. +.IP -s SCRIPT-FILE +Load Scheme source from SCRIPT-FILE and execute as a script. + +.SH ENVIRONMENT +.\".TP \w'MANROFFSEQ\ \ 'u +.TP +.B GUILE_LOAD_PATH +If +.RB $ GUILE_LOAD_PATH +is set, its value is used to agument the path to search for scheme +files when loading. It should be a colon separated list of +directories which will be prepended to the default %load-path. + +.SH FILES +.I ~/.guile +is a guile script that is executed before any other processing occurs. +For example, the following .guile activates guile's readline +interface: + +.RS 4 +(use-modules (ice-9 readline)) +.RS 0 +(activate-readline) + +.SH "SEE ALSO" +The full documentation for guile is maintained as a Texinfo manual. If +the info and guile programs are properly installed at your site, the +command +.IP +.B info guile +.PP +should give you access to the complete manual. + +http://www.schemers.org provides a general introduction to the +Scheme language. + +.SH AUTHORS +Robert Merkel wrote this manpage. +Rob Browning has added to it. + +.B guile +is GNU software. Guile is originally based on Aubrey Jaffer's +SCM interpreter, and is the work of many individuals. diff --git a/guile18/doc/hacks.el b/guile18/doc/hacks.el new file mode 100644 index 0000000000..c5a3f576be --- /dev/null +++ b/guile18/doc/hacks.el @@ -0,0 +1,16 @@ +;;;; hacks.el --- a few functions to help me work on the manual +;;;; Jim Blandy --- October 1998 + +(defun jh-exemplify-region (start end) + (interactive "r") + (save-excursion + (save-restriction + (narrow-to-region start end) + + ;; Texinfo doesn't handle tabs well. + (untabify (point-min) (point-max)) + + ;; Quote any characters special to texinfo. + (goto-char (point-min)) + (while (re-search-forward "[{}@]" nil t) + (replace-match "@\\&"))))) diff --git a/guile18/doc/maint/ChangeLog-2008 b/guile18/doc/maint/ChangeLog-2008 new file mode 100644 index 0000000000..0c6e618d63 --- /dev/null +++ b/guile18/doc/maint/ChangeLog-2008 @@ -0,0 +1,75 @@ +2004-08-25 Marius Vollmer + + * docstring.el (docstring-process-alist): Consider entries in + reverse order. That puts them in new-docstrings.texi in the same + order as in the C source. + +2004-08-23 Marius Vollmer + + * docstring.el: Replaced all "@c module" markers with "@c + module-for-docstring", making it less likely to collide with a + real commentary. + +2002-10-19 Neil Jerram + + * guile.texi: Replaced by regenerated libguile version. + +2002-07-10 Gary Houston + + * docstring.el: optional 2nd environment variable to locate + built files. + +2002-07-09 Gary Houston + + * docstring.el: defined caddr, used in several places but missing + for some reason. + +2002-04-02 Thien-Thi Nguyen + + * doctring.el: List commands in commentary; nfc. + +2002-03-15 Neil Jerram + + * guile.texi: Replaced by regenerated libguile version. + +2002-03-12 Neil Jerram + + * guile.texi: Replaced by regenerated libguile version. + +2002-03-08 Neil Jerram + + * docstring.el (docstring-libguile-directory, + docstring-display-location, docstring-show-source): New. + +2001-11-16 Neil Jerram + + * guile.texi: Replaced by regenerated libguile version. + + * docstring.el (make-module-description-list): Exclude @deffn's + with category {C Function}. + (docstring-process-alist): Bind key "d" to + docstring-ediff-this-line in the docstring output buffer. + +2001-11-13 Neil Jerram + + * guile.texi: Replaced by libguile version (after automatically + updating docstrings in the reference manual). + +2001-11-07 Neil Jerram + + * guile.texi: Replaced by libguile version (after automatically + updating docstrings in the reference manual). + + * docstring.el (docstring-manual-directory): Added "/ref" to end. + (docstring-manual-files): Now calculated automatically, since by + definition all the .texi files in doc/ref are reference manual + files. + +2001-04-03 Martin Grabmueller + + * guile.texi: Automated docstring merging. + +2001-03-23 Neil Jerram + + * ChangeLog, README, docstring.el, guile.texi: New files. + diff --git a/guile18/doc/maint/README b/guile18/doc/maint/README new file mode 100644 index 0000000000..adfa13f82b --- /dev/null +++ b/guile18/doc/maint/README @@ -0,0 +1,35 @@ +README for guile-core/doc/maint -*- text -*- + +The files in this directory are used by the maintainers to automate +the process of updating the Guile reference manual when the docstrings +in the libguile C source change. + +- ChangeLog is the change log for files in this directory. + +- README is this file. + +- docstring.el is a helpful Emacs Lisp library (see source for + customization). The two key entry points are: + `docstring-process-module' and + `docstring-ediff-this-line'. + +- guile.texi is a snapshot of the built file libguile/guile.texi, + copied last time the reference manual was determined to be in sync + with the libguile source. + +docstring.el requires the setting of an environment variable, e.g., + +export GUILE_MAINTAINER_GUILE_CORE_DIR=$HOME/guile/guile-core + +If the build directory differs from the source directory, an additional +variable is required: + +export GUILE_MAINTAINER_BUILD_CORE_DIR=$HOME/guile/guile-core-build + +If you've just fixed a docstring in, say, ../libguile/strop.c, do in emacs: + + M-x load-file RET .../doc/maint/docstring.el RET + M-x docstring-process-module RET (guile) RET + +Save all modified .texi files and copy the current ../libguile/guile.texi +to ./guile.texi, then commit. See elisp var `docstring-snarfed-roots'. diff --git a/guile18/doc/maint/docstring.el b/guile18/doc/maint/docstring.el new file mode 100644 index 0000000000..2b5639eb65 --- /dev/null +++ b/guile18/doc/maint/docstring.el @@ -0,0 +1,622 @@ +;;; docstring.el --- utilities for Guile docstring maintenance +;;; +;;; Copyright (C) 2001, 2004 Neil Jerram +;;; +;;; This file is not part of GNU Emacs, but the same permissions apply. +;;; +;;; GNU Emacs is free software; you can redistribute it and/or modify +;;; it under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 2, or (at your option) +;;; any later version. +;;; +;;; GNU Emacs is distributed in the hope that it will be useful, +;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Emacs; see the file COPYING. If not, write to the +;;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;;; Boston, MA 02110-1301, USA. + +;;; Commentary: + +;; The basic premise of these utilities is that - at least in the +;; short term - we can get a lot of reference manual mileage by +;; co-opting the docstrings that are snarfed automatically from +;; Guile's C and Scheme source code. But this leads to problems of +;; synchronization... How do you track when a docstring has been +;; updated in the source and so needs updating in the reference +;; manual. What if a procedure is removed from the Guile source? And +;; so on. To complicate matters, the exact snarfed docstring text +;; will probably need to be modified so that it fits into the flow of +;; the manual section in which it appears. Can we design solutions to +;; synchronization problems that continue to work even when the manual +;; text has been enhanced in this way? +;; +;; This file implements an approach to this problem that I have found +;; useful. It involves keeping track of three copies of each +;; docstring: +;; +;; "MANUAL" = the docstring as it appears in the reference manual. +;; +;; "SNARFED" = the docstring as snarfed from the current C or Scheme +;; source. +;; +;; "TRACKING" = the docstring as it appears in a tracking file whose +;; purpose is to record the most recent snarfed docstrings +;; that are known to be in sync with the reference manual. +;; +;; The approaches are as follows. +;; +;; 1. Comparison of MANUAL-DOC, SOURCE-DOC and TRACK-DOC, to produce a +;; summary output buffer in which keystrokes are defined to bring up +;; detailed comparisons. +;; +;; 2. Comparison of MANUAL-DOC, SOURCE-DOC and TRACK-DOC using Ediff. +;; +;; Here is a brief list of commands available (via "M-x COMMAND"): +;; +;; docstring-process-current-buffer +;; docstring-process-current-region BEG END +;; docstring-process-module MODULE +;; docstring-ediff-this-line +;; docstring-show-source + + +(defvar guile-core-dir (or (getenv "GUILE_MAINTAINER_GUILE_CORE_DIR") + (error "GUILE_MAINTAINER_GUILE_CORE_DIR not set")) + "*Full path of guile-core source directory.") + +(defvar guile-build-dir (or (getenv "GUILE_MAINTAINER_BUILD_CORE_DIR") + guile-core-dir) + "*Full path of guile-core build directory. Defaults to guile-core-dir.") + +(defvar docstring-manual-directory (expand-file-name "doc/ref" guile-core-dir) + "*The directory containing the Texinfo source for the Guile reference manual.") + +(defvar docstring-tracking-root (expand-file-name "doc/maint" guile-core-dir) + "*Root directory for docstring tracking files. The tracking file +for module (a b c) is expected to be in the file +/a/b/c.texi.") + +(defvar docstring-snarfed-roots (mapcar + #'(lambda (frag) + (expand-file-name frag guile-build-dir)) + '("libguile" "ice-9" "oop")) + "*List of possible root directories for snarfed docstring files. +For each entry in this list, the snarfed docstring file for module (a +b c) is looked for in the file /a/b/c.texi.") + +(defvar docstring-manual-files + (directory-files docstring-manual-directory nil "\\.texi$" t) + "List of Texinfo source files that comprise the Guile reference manual.") + +(defvar docstring-new-docstrings-file "new-docstrings.texi" + "The name of a file in the Guile reference manual source directory +to which new docstrings should be added.") + +;; Apply FN in turn to each element in the list CANDIDATES until the +;; first application that returns non-nil. +(defun or-map (fn candidates args) + (let ((result nil)) + (while candidates + (setq result (apply fn (car candidates) args)) + (if result + (setq result (cons (car candidates) result) + candidates nil) + (setq candidates (cdr candidates)))) + result)) + +;; Return t if the current buffer position is in the scope of the +;; specified MODULE, as determined by "@c module-for-docstring ..." comments in the +;; buffer. DEFAULT-OK specifies the return value in the case that +;; there are no preceding module comments at all. +(defun docstring-in-module (module default-ok) + (save-excursion + (if (re-search-backward "^@c module-for-docstring " nil t) + (progn + (search-forward "@c module-for-docstring ") + (equal module (read (current-buffer)))) + default-ok))) + +;; Find a docstring in the specified FILE-NAME for the item in module +;; MODULE and with description DESCRIPTION. MODULE should be a list +;; of symbols, Guile-style, for example: '(ice-9 session). +;; DESCRIPTION should be the string that is expected after the @deffn, +;; for example "primitive acons" or "syntax let*". +(defun find-docstring (file-name module description) + (and (file-exists-p file-name) + (let ((buf (find-file-noselect file-name)) + (deffn-regexp (concat "^@deffnx? " + (regexp-quote description) + "[ \n\t]")) + found + result) + (save-excursion + (set-buffer buf) + (goto-char (point-min)) + (while (and (not found) + (re-search-forward deffn-regexp nil t)) + (save-excursion + (goto-char (match-beginning 0)) + (beginning-of-line) + (if (docstring-in-module module t) + (setq found t)))) + (if found + (setq result + (list (current-buffer) + (progn + (re-search-backward "^@deffn ") + (beginning-of-line) + (point)) + (progn + (re-search-forward "^@end deffn") + (forward-line 1) + (point)))))) + result))) + +;; Find the reference manual version of the specified docstring. +;; MODULE and DESCRIPTION specify the docstring as per +;; `find-docstring'. The set of files that `find-manual-docstring' +;; searches is determined by the value of the `docstring-manual-files' +;; variable. +(defun find-manual-docstring (module description) + (let* ((result + (or-map 'find-docstring + (mapcar (function (lambda (file-name) + (concat docstring-manual-directory + "/" + file-name))) + (cons docstring-new-docstrings-file + docstring-manual-files)) + (list module + description))) + (matched-file-name (and (cdr result) + (file-name-nondirectory (car result))))) + (if matched-file-name + (setq docstring-manual-files + (cons matched-file-name + (delete matched-file-name docstring-manual-files)))) + (cdr result))) + +;; Convert MODULE to a directory subpath. +(defun module-to-path (module) + (mapconcat (function (lambda (component) + (symbol-name component))) + module + "/")) + +;; Find the current snarfed version of the specified docstring. +;; MODULE and DESCRIPTION specify the docstring as per +;; `find-docstring'. The file that `find-snarfed-docstring' looks in +;; is automatically generated from MODULE. +(defun find-snarfed-docstring (module description) + (let ((modpath (module-to-path module))) + (cdr (or-map (function (lambda (root) + (find-docstring (concat root + "/" + modpath + ".texi") + module + description))) + docstring-snarfed-roots + nil)))) + +;; Find the tracking version of the specified docstring. MODULE and +;; DESCRIPTION specify the docstring as per `find-docstring'. The +;; file that `find-tracking-docstring' looks in is automatically +;; generated from MODULE. +(defun find-tracking-docstring (module description) + (find-docstring (concat docstring-tracking-root + "/" + (module-to-path module) + ".texi") + module + description)) + +;; Extract an alist of modules and descriptions from the current +;; buffer. +(defun make-module-description-list () + (let ((alist nil) + (module '(guile))) + (save-excursion + (goto-char (point-min)) + (while (re-search-forward "^\\(@c module-for-docstring \\|@deffnx? \\({[^}]+}\\|[^ ]+\\) \\([^ \n]+\\)\\)" + nil + t) + (let ((matched (buffer-substring (match-beginning 1) + (match-end 1)))) + (if (string-equal matched "@c module-for-docstring ") + (setq module (read (current-buffer))) + (let ((type (buffer-substring (match-beginning 2) + (match-end 2)))) + (if (string-equal type "{C Function}") + nil + (setq matched + (concat type + " " + (buffer-substring (match-beginning 3) + (match-end 3)))) + (message "Found docstring: %S: %s" module matched) + (let ((descriptions (assoc module alist))) + (setq alist + (cons (cons module (cons matched (cdr-safe descriptions))) + (if descriptions + (delete descriptions alist) + alist)))))))))) + alist)) + +;; missing in some environments? +(defun caddr (list) + (nth 2 list)) + +;; Return the docstring from the specified LOCATION. LOCATION is a +;; list of three elements: buffer, start position and end position. +(defun location-to-docstring (location) + (and location + (save-excursion + (set-buffer (car location)) + (buffer-substring (cadr location) (caddr location))))) + +;; Perform a comparison of the specified docstring. MODULE and +;; DESCRIPTION are as per usual. +(defun docstring-compare (module description) + (let* ((manual-location (find-manual-docstring module description)) + (snarf-location (find-snarfed-docstring module description)) + (track-location (find-tracking-docstring module description)) + + (manual-docstring (location-to-docstring manual-location)) + (snarf-docstring (location-to-docstring snarf-location)) + (track-docstring (location-to-docstring track-location)) + + action + issue) + + ;; Decide what to do. + (cond ((null snarf-location) + (setq action nil + issue (if manual-location + 'consider-removal + nil))) + + ((null manual-location) + (setq action 'add-to-manual issue nil)) + + ((null track-location) + (setq action nil + issue (if (string-equal manual-docstring snarf-docstring) + nil + 'check-needed))) + + ((string-equal track-docstring snarf-docstring) + (setq action nil issue nil)) + + ((string-equal track-docstring manual-docstring) + (setq action 'auto-update-manual issue nil)) + + (t + (setq action nil issue 'update-needed))) + + ;; Return a pair indicating any automatic action that can be + ;; taken, and any issue for resolution. + (cons action issue))) + +;; Add the specified docstring to the manual. +(defun docstring-add-to-manual (module description) + (let ((buf (find-file-noselect (concat docstring-manual-directory + "/" + docstring-new-docstrings-file)))) + (save-excursion + (set-buffer buf) + (goto-char (point-max)) + (or (docstring-in-module module nil) + (insert "\n@c module-for-docstring " (prin1-to-string module) "\n")) + (insert "\n" (location-to-docstring (find-snarfed-docstring module + description)))))) + +;; Auto-update the specified docstring in the manual. +(defun docstring-auto-update-manual (module description) + (let ((manual-location (find-manual-docstring module description)) + (track-location (find-tracking-docstring module description))) + (save-excursion + (set-buffer (car manual-location)) + (goto-char (cadr manual-location)) + (delete-region (cadr manual-location) (caddr manual-location)) + (insert (location-to-docstring (find-snarfed-docstring module + description)))))) + +;; Process an alist of modules and descriptions, and produce a summary +;; buffer describing actions taken and issues to be resolved. +(defun docstring-process-alist (alist) + (let (check-needed-list + update-needed-list + consider-removal-list + added-to-manual-list + auto-updated-manual-list) + + (mapcar + (function (lambda (module-list) + (let ((module (car module-list))) + (message "Module: %S" module) + (mapcar + (function (lambda (description) + (message "Comparing docstring: %S: %s" module description) + (let* ((ai (docstring-compare module description)) + (action (car ai)) + (issue (cdr ai))) + + (cond ((eq action 'add-to-manual) + (docstring-add-to-manual module description) + (setq added-to-manual-list + (cons (cons module description) + added-to-manual-list))) + + ((eq action 'auto-update-manual) + (docstring-auto-update-manual module description) + (setq auto-updated-manual-list + (cons (cons module description) + auto-updated-manual-list)))) + + (cond ((eq issue 'check-needed) + (setq check-needed-list + (cons (cons module description) + check-needed-list))) + + ((eq issue 'update-needed) + (setq update-needed-list + (cons (cons module description) + update-needed-list))) + + ((eq issue 'consider-removal) + (setq consider-removal-list + (cons (cons module description) + consider-removal-list))))))) + (reverse (cdr module-list)))))) + alist) + + ;; Prepare a buffer describing the results. + (set-buffer (get-buffer-create "*Docstring Results*")) + (erase-buffer) + + (insert " +The following items have been automatically added to the manual in +file `" docstring-manual-directory "/" docstring-new-docstrings-file "'.\n\n") + (if added-to-manual-list + (mapcar (function (lambda (moddesc) + (insert (prin1-to-string (car moddesc)) + ": " + (cdr moddesc) + "\n"))) + added-to-manual-list) + (insert "(none)\n")) + + (insert " +The following items have been automatically updated in the manual.\n\n") + (if auto-updated-manual-list + (mapcar (function (lambda (moddesc) + (insert (prin1-to-string (car moddesc)) + ": " + (cdr moddesc) + "\n"))) + auto-updated-manual-list) + (insert "(none)\n")) + + (insert " +The following items are already documented in the manual but are not +mentioned in the reference copy of the snarfed docstrings file. +You should check that the manual documentation matches the docstring +in the current snarfed docstrings file.\n\n") + (if check-needed-list + (mapcar (function (lambda (moddesc) + (insert (prin1-to-string (car moddesc)) + ": " + (cdr moddesc) + "\n"))) + check-needed-list) + (insert "(none)\n")) + + (insert " +The following items have manual documentation that is different from +the docstring in the reference copy of the snarfed docstrings file, +and the snarfed docstring has changed. You need to update the manual +documentation by hand with reference to the snarfed docstring changes.\n\n") + (if update-needed-list + (mapcar (function (lambda (moddesc) + (insert (prin1-to-string (car moddesc)) + ": " + (cdr moddesc) + "\n"))) + update-needed-list) + (insert "(none)\n")) + + (insert " +The following items are documented in the manual but are no longer +present in the snarfed docstrings file. You should consider whether +the existing manual documentation is still pertinent. If it is, its +docstring module comment may need updating, to connect it with a +new snarfed docstring file.\n\n") + (if consider-removal-list + (mapcar (function (lambda (moddesc) + (insert (prin1-to-string (car moddesc)) + ": " + (cdr moddesc) + "\n"))) + consider-removal-list) + (insert "(none)\n")) + (insert "\n") + + (goto-char (point-min)) + (local-set-key "d" 'docstring-ediff-this-line) + + ;; Popup the issues buffer. + (let ((pop-up-frames t)) + (set-window-point (display-buffer (current-buffer)) + (point-min))))) + +(defun docstring-process-current-buffer () + (interactive) + (docstring-process-alist (make-module-description-list))) + +(defun docstring-process-current-region (beg end) + (interactive "r") + (narrow-to-region beg end) + (unwind-protect + (save-excursion + (docstring-process-alist (make-module-description-list))) + (widen))) + +(defun docstring-process-module (module) + (interactive "xModule: ") + (let ((modpath (module-to-path module)) + (mdlist nil)) + (mapcar (function (lambda (root) + (let ((fn (concat root + "/" + modpath + ".texi"))) + (if (file-exists-p fn) + (save-excursion + (find-file fn) + (message "Getting docstring list from %s" fn) + (setq mdlist + (append mdlist + (make-module-description-list)))))))) + docstring-snarfed-roots) + (docstring-process-alist mdlist))) + +(defun docstring-ediff-this-line () + (interactive) + (let (module + description) + (save-excursion + (beginning-of-line) + (setq module (read (current-buffer))) + (forward-char 2) + (setq description (buffer-substring (point) + (progn + (end-of-line) + (point))))) + + (message "Ediff docstring: %S: %s" module description) + + (let ((track-location (or (find-tracking-docstring module description) + (docstring-temp-location "No docstring in tracking file"))) + (snarf-location (or (find-snarfed-docstring module description) + (docstring-temp-location "No docstring in snarfed file"))) + (manual-location (or (find-manual-docstring module description) + (docstring-temp-location "No docstring in manual")))) + + (setq docstring-ediff-buffers + (list (car track-location) + (car snarf-location) + (car manual-location))) + + (docstring-narrow-to-location track-location) + (docstring-narrow-to-location snarf-location) + (docstring-narrow-to-location manual-location) + + (add-hook 'ediff-quit-hook 'docstring-widen-ediff-buffers) + + (ediff-buffers3 (nth 0 docstring-ediff-buffers) + (nth 1 docstring-ediff-buffers) + (nth 2 docstring-ediff-buffers))))) + +(defun docstring-narrow-to-location (location) + (save-excursion + (set-buffer (car location)) + (narrow-to-region (cadr location) (caddr location)))) + +(defun docstring-temp-location (str) + (let ((buf (generate-new-buffer "*Docstring Temp*"))) + (save-excursion + (set-buffer buf) + (erase-buffer) + (insert str "\n") + (list buf (point-min) (point-max))))) + +(require 'ediff) + +(defvar docstring-ediff-buffers '()) + +(defun docstring-widen-ediff-buffers () + (remove-hook 'ediff-quit-hook 'docstring-widen-ediff-buffers) + (save-excursion + (mapcar (function (lambda (buffer) + (set-buffer buffer) + (widen))) + docstring-ediff-buffers))) + + +;;; Tests: + +;(find-docstring "/home/neil/Guile/cvs/guile-core/doc/maint/guile.texi" nil "primitive sloppy-assq") +;(find-manual-docstring '(guile) "primitive sloppy-assq") +;(find-tracking-docstring '(guile) "primitive sloppy-assq") +;(find-snarfed-docstring '(guile) "primitive sloppy-assq") + +(defvar docstring-libguile-directory (expand-file-name "libguile" + guile-core-dir) + "*The directory containing the C source for libguile.") + +(defvar docstring-libguile-build-directory (expand-file-name "libguile" + guile-build-dir) + "*The directory containing the libguile build directory.") + +(defun docstring-display-location (file line) + (let ((buffer (find-file-noselect + (expand-file-name file docstring-libguile-directory)))) + (if buffer + (let* ((window (or (get-buffer-window buffer) + (display-buffer buffer))) + (pos (save-excursion + (set-buffer buffer) + (goto-line line) + (point)))) + (set-window-point window pos))))) + +(defun docstring-show-source () + "Given that point is sitting in a docstring in one of the Texinfo +source files for the Guile manual, and that that docstring may be +snarfed automatically from a libguile C file, determine whether the +docstring is from libguile and, if it is, display the relevant C file +at the line from which the docstring was snarfed. + +Why? When updating snarfed docstrings, you should usually edit the C +source rather than the Texinfo source, so that your updates benefit +Guile's online help as well. This function locates the C source for a +docstring so that it is easy for you to do this." + (interactive) + (let* ((deffn-line + (save-excursion + (end-of-line) + (or (re-search-backward "^@deffn " nil t) + (error "No docstring here!")) + (buffer-substring (point) + (progn + (end-of-line) + (point))))) + (guile-texi-file + (expand-file-name "guile.texi" docstring-libguile-build-directory)) + (source-location + (save-excursion + (set-buffer (find-file-noselect guile-texi-file)) + (save-excursion + (goto-char (point-min)) + (or (re-search-forward (concat "^" + (regexp-quote deffn-line) + "$") + nil t) + (error "Docstring not from libguile")) + (forward-line -1) + (if (looking-at "^@c snarfed from \\([^:]+\\):\\([0-9]+\\)$") + (cons (match-string 1) + (string-to-int (match-string 2))) + (error "Corrupt docstring entry in guile.texi")))))) + (docstring-display-location (car source-location) + (cdr source-location)))) + + +(provide 'docstring) + +;;; docstring.el ends here diff --git a/guile18/doc/mbapi.texi b/guile18/doc/mbapi.texi new file mode 100644 index 0000000000..3f53ccdb27 --- /dev/null +++ b/guile18/doc/mbapi.texi @@ -0,0 +1,987 @@ +\input texinfo +@setfilename mbapi.info +@settitle Multibyte API +@setchapternewpage off + +@c Open issues: + +@c What's the best way to report errors? Should functions return a +@c magic value, according to C tradition, or should they signal a +@c Guile exception? + +@c + + +@node Working With Multibyte Strings in C +@chapter Working With Multibyte Strings in C + +Guile allows strings to contain characters drawn from a wide variety of +languages, including many Asian, Eastern European, and Middle Eastern +languages, in a uniform and unrestricted way. The string representation +normally used in C code --- an array of @sc{ASCII} characters --- is not +sufficient for Guile strings, since they may contain characters not +present in @sc{ASCII}. + +Instead, Guile uses a very large character set, and encodes each +character as a sequence of one or more bytes. We call this +variable-width encoding a @dfn{multibyte} encoding. Guile uses this +single encoding internally for all strings, symbol names, error +messages, etc., and performs appropriate conversions upon input and +output. + +The use of this variable-width encoding is almost invisible to Scheme +code. Strings are still indexed by character number, not by byte +offset; @code{string-length} still returns the length of a string in +characters, not in bytes. @code{string-ref} and @code{string-set!} are +no longer guaranteed to be constant-time operations, but Guile uses +various strategies to reduce the impact of this change. + +However, the encoding is visible via Guile's C interface, which gives +the user direct access to a string's bytes. This chapter explains how +to work with Guile multibyte text in C code. Since variable-width +encodings are clumsier to work with than simple fixed-width encodings, +Guile provides a set of standard macros and functions for manipulating +multibyte text to make the job easier. Furthermore, Guile makes some +promises about the encoding which you can use in writing your own text +processing code. + +While we discuss guaranteed properties of Guile's encoding, and provide +functions to operate on its character set, we do not actually specify +either the character set or encoding here. This is because we expect +both of them to change in the future: currently, Guile uses the same +encoding as GNU Emacs 20.4, but we hope to change Guile (and GNU Emacs +as well) to use Unicode and UTF-8, with some extensions. This will make +it more comfortable to use Guile with other systems which use UTF-8, +like the GTk user interface toolkit. + +@menu +* Multibyte String Terminology:: +* Promised Properties of the Guile Multibyte Encoding:: +* Functions for Operating on Multibyte Text:: +* Multibyte Text Processing Errors:: +* Why Guile Does Not Use a Fixed-Width Encoding:: +@end menu + + +@node Multibyte String Terminology, Promised Properties of the Guile Multibyte Encoding, Working With Multibyte Strings in C, Working With Multibyte Strings in C +@section Multibyte String Terminology + +In the descriptions which follow, we make the following definitions: +@table @dfn + +@item byte +A @dfn{byte} is a number between 0 and 255. It has no inherent textual +interpretation. So 65 is a byte, not a character. + +@item character +A @dfn{character} is a unit of text. It has no inherent numeric value. +@samp{A} and @samp{.} are characters, not bytes. (This is different +from the C language's definition of @dfn{character}; in this chapter, we +will always use a phrase like ``the C language's @code{char} type'' when +that's what we mean.) + +@item character set +A @dfn{character set} is an invertible mapping between numbers and a +given set of characters. @sc{ASCII} is a character set assigning +characters to the numbers 0 through 127. It maps @samp{A} onto the +number 65, and @samp{.} onto 46. + +Note that a character set maps characters onto numbers, @emph{not +necessarily} onto bytes. For example, the Unicode character set maps +the Greek lower-case @samp{alpha} character onto the number 945, which +is not a byte. + +(This is what Internet standards would call a "coding character set".) + +@item encoding +An encoding maps numbers onto sequences of bytes. For example, the +UTF-8 encoding, defined in the Unicode Standard, would map the number +945 onto the sequence of bytes @samp{206 177}. When using the +@sc{ASCII} character set, every number assigned also happens to be a +byte, so there is an obvious trivial encoding for @sc{ASCII} in bytes. + +(This is what Internet standards would call a "character encoding +scheme".) + +@end table + +Thus, to turn a character into a sequence of bytes, you need a character +set to assign a number to that character, and then an encoding to turn +that number into a sequence of bytes. + +Likewise, to interpret a sequence of bytes as a sequence of characters, +you use an encoding to extract a sequence of numbers from the bytes, and +then a character set to turn the numbers into characters. + +Errors can occur while carrying out either of these processes. For +example, under a particular encoding, a given string of bytes might not +correspond to any number. For example, the byte sequence @samp{128 128} +is not a valid encoding of any number under UTF-8. + +Having carefully defined our terminology, we will now abuse it. + +We will sometimes use the word @dfn{character} to refer to the number +assigned to a character by a character set, in contexts where it's +obvious we mean a number. + +Sometimes there is a close association between a particular encoding and +a particular character set. Thus, we may sometimes refer to the +character set and encoding together as an @dfn{encoding}. + + +@node Promised Properties of the Guile Multibyte Encoding, Functions for Operating on Multibyte Text, Multibyte String Terminology, Working With Multibyte Strings in C +@section Promised Properties of the Guile Multibyte Encoding + +Internally, Guile uses a single encoding for all text --- symbols, +strings, error messages, etc. Here we list a number of helpful +properties of Guile's encoding. It is correct to write code which +assumes these properties; code which uses these assumptions will be +portable to all future versions of Guile, as far as we know. + +@b{Every @sc{ASCII} character is encoded as a single byte from 0 to 127, in +the obvious way.} This means that a standard C string containing only +@sc{ASCII} characters is a valid Guile string (except for the terminator; +Guile strings store the length explicitly, so they can contain null +characters). + +@b{The encodings of non-@sc{ASCII} characters use only bytes between 128 +and 255.} That is, when we turn a non-@sc{ASCII} character into a +series of bytes, none of those bytes can ever be mistaken for the +encoding of an @sc{ASCII} character. This means that you can search a +Guile string for an @sc{ASCII} character using the standard +@code{memchr} library function. By extension, you can search for an +@sc{ASCII} substring in a Guile string using a traditional substring +search algorithm --- you needn't add special checks to verify encoding +boundaries, etc. + +@b{No character encoding is a subsequence of any other character +encoding.} (This is just a stronger version of the previous promise.) +This means that you can search for occurrences of one Guile string +within another Guile string just as if they were raw byte strings. You +can use the stock @code{memmem} function (provided on GNU systems, at +least) for such searches. If you don't need the ability to represent +null characters in your text, you can still use null-termination for +strings, and use the traditional string-handling functions like +@code{strlen}, @code{strstr}, and @code{strcat}. + +@b{You can always determine the full length of a character's encoding +from its first byte.} Guile provides the macro @code{scm_mb_len} which +computes the encoding's length from its first byte. Given the first +rule, you can see that @code{scm_mb_len (@var{b})}, for any @code{0 <= +@var{b} <= 127}, returns 1. + +@b{Given an arbitrary byte position in a Guile string, you can always +find the beginning and end of the character containing that byte without +scanning too far in either direction.} This means that, if you are sure +a byte sequence is a valid encoding of a character sequence, you can +find character boundaries without keeping track of the beginning and +ending of the overall string. This promise relies on the fact that, in +addition to storing the string's length explicitly, Guile always either +terminates the string's storage with a zero byte, or shares it with +another string which is terminated this way. + + +@node Functions for Operating on Multibyte Text, Multibyte Text Processing Errors, Promised Properties of the Guile Multibyte Encoding, Working With Multibyte Strings in C +@section Functions for Operating on Multibyte Text + +Guile provides a variety of functions, variables, and types for working +with multibyte text. + +@menu +* Basic Multibyte Character Processing:: +* Finding Character Encoding Boundaries:: +* Multibyte String Functions:: +* Exchanging Guile Text With the Outside World in C:: +* Implementing Your Own Text Conversions:: +@end menu + + +@node Basic Multibyte Character Processing, Finding Character Encoding Boundaries, Functions for Operating on Multibyte Text, Functions for Operating on Multibyte Text +@subsection Basic Multibyte Character Processing + +Here are the essential types and functions for working with Guile text. +Guile uses the C type @code{unsigned char *} to refer to text encoded +with Guile's encoding. + +Note that any operation marked here as a ``Libguile Macro'' might +evaluate its argument multiple times. + +@deftp {Libguile Type} scm_char_t +This is a signed integral type large enough to hold any character in +Guile's character set. All character numbers are positive. +@end deftp + +@deftypefn {Libguile Macro} scm_char_t scm_mb_get (const unsigned char *@var{p}) +Return the character whose encoding starts at @var{p}. If @var{p} does +not point at a valid character encoding, the behavior is undefined. +@end deftypefn + +@deftypefn {Libguile Macro} int scm_mb_put (unsigned char *@var{p}, scm_char_t @var{c}) +Place the encoded form of the Guile character @var{c} at @var{p}, and +return its length in bytes. If @var{c} is not a Guile character, the +behavior is undefined. +@end deftypefn + +@deftypevr {Libguile Constant} int scm_mb_max_len +The maximum length of any character's encoding, in bytes. You may +assume this is relatively small --- less than a dozen or so. +@end deftypevr + +@deftypefn {Libguile Macro} int scm_mb_len (unsigned char @var{b}) +If @var{b} is the first byte of a character's encoding, return the full +length of the character's encoding, in bytes. If @var{b} is not a valid +leading byte, the behavior is undefined. +@end deftypefn + +@deftypefn {Libguile Macro} int scm_mb_char_len (scm_char_t @var{c}) +Return the length of the encoding of the character @var{c}, in bytes. +If @var{c} is not a valid Guile character, the behavior is undefined. +@end deftypefn + +@deftypefn {Libguile Function} scm_char_t scm_mb_get_func (const unsigned char *@var{p}) +@deftypefnx {Libguile Function} int scm_mb_put_func (unsigned char *@var{p}, scm_char_t @var{c}) +@deftypefnx {Libguile Function} int scm_mb_len_func (unsigned char @var{b}) +@deftypefnx {Libguile Function} int scm_mb_char_len_func (scm_char_t @var{c}) +These are functions identical to the corresponding macros. You can use +them in situations where the overhead of a function call is acceptable, +and the cleaner semantics of function application are desireable. +@end deftypefn + + +@node Finding Character Encoding Boundaries, Multibyte String Functions, Basic Multibyte Character Processing, Functions for Operating on Multibyte Text +@subsection Finding Character Encoding Boundaries + +These are functions for finding the boundaries between characters in +multibyte text. + +Note that any operation marked here as a ``Libguile Macro'' might +evaluate its argument multiple times, unless the definition promises +otherwise. + +@deftypefn {Libguile Macro} int scm_mb_boundary_p (const unsigned char *@var{p}) +Return non-zero iff @var{p} points to the start of a character in +multibyte text. + +This macro will evaluate its argument only once. +@end deftypefn + +@deftypefn {Libguile Function} {const unsigned char *} scm_mb_floor (const unsigned char *@var{p}) +``Round'' @var{p} to the previous character boundary. That is, if +@var{p} points to the middle of the encoding of a Guile character, +return a pointer to the first byte of the encoding. If @var{p} points +to the start of the encoding of a Guile character, return @var{p} +unchanged. +@end deftypefn + +@deftypefn {libguile Function} {const unsigned char *} scm_mb_ceiling (const unsigned char *@var{p}) +``Round'' @var{p} to the next character boundary. That is, if @var{p} +points to the middle of the encoding of a Guile character, return a +pointer to the first byte of the encoding of the next character. If +@var{p} points to the start of the encoding of a Guile character, return +@var{p} unchanged. +@end deftypefn + +Note that it is usually not friendly for functions to silently correct +byte offsets that point into the middle of a character's encoding. Such +offsets almost always indicate a programming error, and they should be +reported as early as possible. So, when you write code which operates +on multibyte text, you should not use functions like these to ``clean +up'' byte offsets which the originator believes to be correct; instead, +your code should signal a @code{text:not-char-boundary} error as soon as +it detects an invalid offset. @xref{Multibyte Text Processing Errors}. + + +@node Multibyte String Functions, Exchanging Guile Text With the Outside World in C, Finding Character Encoding Boundaries, Functions for Operating on Multibyte Text +@subsection Multibyte String Functions + +These functions allow you to operate on multibyte strings: sequences of +character encodings. + +@deftypefn {Libguile Function} int scm_mb_count (const unsigned char *@var{p}, int @var{len}) +Return the number of Guile characters encoded by the @var{len} bytes at +@var{p}. + +If the sequence contains any invalid character encodings, or ends with +an incomplete character encoding, signal a @code{text:bad-encoding} +error. +@end deftypefn + +@deftypefn {Libguile Macro} scm_char_t scm_mb_walk (unsigned char **@var{pp}) +Return the character whose encoding starts at @code{*@var{pp}}, and +advance @code{*@var{pp}} to the start of the next character. Return -1 +if @code{*@var{pp}} does not point to a valid character encoding. +@end deftypefn + +@deftypefn {Libguile Function} {const unsigned char *} scm_mb_prev (const unsigned char *@var{p}) +If @var{p} points to the middle of the encoding of a Guile character, +return a pointer to the first byte of the encoding. If @var{p} points +to the start of the encoding of a Guile character, return the start of +the previous character's encoding. + +This is like @code{scm_mb_floor}, but the returned pointer will always +be before @var{p}. If you use this function to drive an iteration, it +guarantees backward progress. +@end deftypefn + +@deftypefn {Libguile Function} {const unsigned char *} scm_mb_next (const unsigned char *@var{p}) +If @var{p} points to the encoding of a Guile character, return a pointer +to the first byte of the encoding of the next character. + +This is like @code{scm_mb_ceiling}, but the returned pointer will always +be after @var{p}. If you use this function to drive an iteration, it +guarantees forward progress. +@end deftypefn + +@deftypefn {Libguile Function} {const unsigned char *} scm_mb_index (const unsigned char *@var{p}, int @var{len}, int @var{i}) +Assuming that the @var{len} bytes starting at @var{p} are a +concatenation of valid character encodings, return a pointer to the +start of the @var{i}'th character encoding in the sequence. + +This function scans the sequence from the beginning to find the +@var{i}'th character, and will generally require time proportional to +the distance from @var{p} to the returned address. + +If the sequence contains any invalid character encodings, or ends with +an incomplete character encoding, signal a @code{text:bad-encoding} +error. +@end deftypefn + +It is common to process the characters in a string from left to right. +However, if you fetch each character using @code{scm_mb_index}, each +call will scan the text from the beginning, so your loop will require +time proportional to at least the square of the length of the text. To +avoid this poor performance, you can use an @code{scm_mb_cache} +structure and the @code{scm_mb_index_cached} macro. + +@deftp {Libguile Type} {struct scm_mb_cache} +This structure holds information that allows a string scanning operation +to use the results from a previous scan of the string. It has the +following members: +@table @code + +@item character +An index, in characters, into the string. + +@item byte +The index, in bytes, of the start of that character. + +@end table + +In other words, @code{byte} is the byte offset of the +@code{character}'th character of the string. Note that if @code{byte} +and @code{character} are equal, then all characters before that point +must have encodings exactly one byte long, and the string can be indexed +normally. + +All elements of a @code{struct scm_mb_cache} structure should be +initialized to zero before its first use, and whenever the string's text +changes. +@end deftp + +@deftypefn {Libguile Macro} const unsigned char *scm_mb_index_cached (const unsigned char *@var{p}, int @var{len}, int @var{i}, struct scm_mb_cache *@var{cache}) +@deftypefnx {Libguile Function} const unsigned char *scm_mb_index_cached_func (const unsigned char *@var{p}, int @var{len}, int @var{i}, struct scm_mb_cache *@var{cache}) +This macro and this function are identical to @code{scm_mb_index}, +except that they may consult and update *@var{cache} in order to avoid +scanning the string from the beginning. @code{scm_mb_index_cached} is a +macro, so it may have less overhead than +@code{scm_mb_index_cached_func}, but it may evaluate its arguments more +than once. + +Using @code{scm_mb_index_cached} or @code{scm_mb_index_cached_func}, you +can scan a string from left to right, or from right to left, in time +proportional to the length of the string. As long as each character +fetched is less than some constant distance before or after the previous +character fetched with @var{cache}, each access will require constant +time. +@end deftypefn + +Guile also provides functions to convert between an encoded sequence of +characters, and an array of @code{scm_char_t} objects. + +@deftypefn {Libguile Function} scm_char_t *scm_mb_multibyte_to_fixed (const unsigned char *@var{p}, int @var{len}, int *@var{result_len}) +Convert the variable-width text in the @var{len} bytes at @var{p} +to an array of @code{scm_char_t} values. Return a pointer to the array, +and set @code{*@var{result_len}} to the number of elements it contains. +The returned array is allocated with @code{malloc}, and it is the +caller's responsibility to free it. + +If the text is not a sequence of valid character encodings, this +function will signal a @code{text:bad-encoding} error. +@end deftypefn + +@deftypefn {Libguile Function} unsigned char *scm_mb_fixed_to_multibyte (const scm_char_t *@var{fixed}, int @var{len}, int *@var{result_len}) +Convert the array of @code{scm_char_t} values to a sequence of +variable-width character encodings. Return a pointer to the array of +bytes, and set @code{*@var{result_len}} to its length, in bytes. + +The returned byte sequence is terminated with a zero byte, which is not +counted in the length returned in @code{*@var{result_len}}. + +The returned byte sequence is allocated with @code{malloc}; it is the +caller's responsibility to free it. + +If the text is not a sequence of valid character encodings, this +function will signal a @code{text:bad-encoding} error. +@end deftypefn + + +@node Exchanging Guile Text With the Outside World in C, Implementing Your Own Text Conversions, Multibyte String Functions, Functions for Operating on Multibyte Text +@subsection Exchanging Guile Text With the Outside World in C + +[[This is kind of a heavy-weight model, given that one end of the +conversion is always going to be the Guile encoding. Any way to shorten +things a bit?]] + +Guile provides functions for converting between Guile's internal text +representation and encodings popular in the outside world. These +functions are closely modeled after the @code{iconv} functions available +on some systems. + +To convert text between two encodings, you should first call +@code{scm_mb_iconv_open} to indicate the source and destination +encodings; this function returns a context object which records the +conversion to perform. + +Then, you should call @code{scm_mb_iconv} to actually convert the text. +This function expects input and output buffers, and a pointer to the +context you got from @var{scm_mb_iconv_open}. You don't need to pass +all your input to @code{scm_mb_iconv} at once; you can invoke it on +successive blocks of input (as you read it from a file, say), and it +will convert as much as it can each time, indicating when you should +grow your output buffer. + +An encoding may be @dfn{stateless}, or @dfn{stateful}. In most +encodings, a contiguous group of bytes from the sequence completely +specifies a particular character; these are stateless encodings. +However, some encodings require you to look back an unbounded number of +bytes in the stream to assign a meaning to a particular byte sequence; +such encodings are stateful. + +For example, in the @samp{ISO-2022-JP} encoding for Japanese text, the +byte sequence @samp{27 36 66} indicates that subsequent bytes should be +taken in pairs and interpreted as characters from the JIS-0208 character +set. An arbitrary number of byte pairs may follow this sequence. The +byte sequence @samp{27 40 66} indicates that subsequent bytes should be +interpreted as @sc{ASCII}. In this encoding, you cannot tell whether a +given byte is an @sc{ASCII} character without looking back an arbitrary +distance for the most recent escape sequence, so it is a stateful +encoding. + +In Guile, if a conversion involves a stateful encoding, the context +object carries any necessary state. Thus, you can have many independent +conversions to or from stateful encodings taking place simultaneously, +as long as each data stream uses its own context object for the +conversion. + +@deftp {Libguile Type} {struct scm_mb_iconv} +This is the type for context objects, which represent the encodings and +current state of an ongoing text conversion. A @code{struct +scm_mb_iconv} records the source and destination encodings, and keeps +track of any information needed to handle stateful encodings. +@end deftp + +@deftypefn {Libguile Function} {struct scm_mb_iconv *} scm_mb_iconv_open (const char *@var{tocode}, const char *@var{fromcode}) +Return a pointer to a new @code{struct scm_mb_iconv} context object, +ready to convert from the encoding named @var{fromcode} to the encoding +named @var{tocode}. For stateful encodings, the context object is in +some appropriate initial state, ready for use with the +@code{scm_mb_iconv} function. + +When you are done using a context object, you may call +@code{scm_mb_iconv_close} to free it. + +If either @var{tocode} or @var{fromcode} is not the name of a known +encoding, this function will signal the @code{text:unknown-conversion} +error, described below. + +@c Try to use names here from the IANA list: +@c see ftp://ftp.isi.edu/in-notes/iana/assignments/character-sets +Guile supports at least these encodings: +@table @samp + +@item US-ASCII +@sc{US-ASCII}, in the standard one-character-per-byte encoding. + +@item ISO-8859-1 +The usual character set for Western European languages, in its usual +one-character-per-byte encoding. + +@item Guile-MB +Guile's current internal multibyte encoding. The actual encoding this +name refers to will change from one version of Guile to the next. You +should use this when converting data between external sources and the +encoding used by Guile objects. + +You should @emph{not} use this as the encoding for data presented to the +outside world, for two reasons. 1) Its meaning will change over time, +so data written using the @samp{guile} encoding with one version of +Guile might not be readable with the @samp{guile} encoding in another +version of Guile. 2) It currently corresponds to @samp{Emacs-Mule}, +which invented for Emacs's internal use, and was never intended to serve +as an exchange medium. + +@item Guile-Wide +Guile's character set, as an array of @code{scm_char_t} values. + +Note that this encoding is even less suitable for public use than +@samp{Guile}, since the exact sequence of bytes depends heavily on the +size and endianness the host system uses for @code{scm_char_t}. Using +this encoding is very much like calling the +@code{scm_mb_multibyte_to_fixed} or @code{scm_mb_fixed_to_multibyte} +functions, except that @code{scm_mb_iconv} gives you more control over +buffer allocation and management. + +@item Emacs-Mule +This is the variable-length encoding for multi-lingual text by GNU +Emacs, at least through version 20.4. You probably should not use this +encoding, as it is designed only for Emacs's internal use. However, we +provide it here because it's trivial to support, and some people +probably do have @samp{emacs-mule}-format files lying around. + +@end table + +(At the moment, this list doesn't include any character sets suitable for +external use that can actually handle multilingual data; this is +unfortunate, as it encourages users to write data in Emacs-Mule format, +which nobody but Emacs and Guile understands. We hope to add support +for Unicode in UTF-8 soon, which should solve this problem.) + +Case is not significant in encoding names. + +You can define your own conversions; see @ref{Implementing Your Own Text +Conversions}. +@end deftypefn + +@deftypefn {Libguile Function} int scm_mb_have_encoding (const char *@var{encoding}) +Return a non-zero value if Guile supports the encoding named @var{encoding}[[]] +@end deftypefn + +@deftypefn {Libguile Function} size_t scm_mb_iconv (struct scm_mb_iconv *@var{context}, const char **@var{inbuf}, size_t *@var{inbytesleft}, char **@var{outbuf}, size_t *@var{outbytesleft}) +Convert a sequence of characters from one encoding to another. The +argument @var{context} specifies the encodings to use for the input and +output, and carries state for stateful encodings; use +@code{scm_mb_iconv_open} to create a @var{context} object for a +particular conversion. + +Upon entry to the function, @code{*@var{inbuf}} should point to the +input buffer, and @code{*@var{inbytesleft}} should hold the number of +input bytes present in the buffer; @code{*@var{outbuf}} should point to +the output buffer, and @code{*@var{outbytesleft}} should hold the number +of bytes available to hold the conversion results in that buffer. + +Upon exit from the function, @code{*@var{inbuf}} points to the first +unconsumed byte of input, and @code{*@var{inbytesleft}} holds the number +of unconsumed input bytes; @code{*@var{outbuf}} points to the byte after +the last output byte, and @code{*@var{outbyteleft}} holds the number of +bytes left unused in the output buffer. + +For stateful encodings, @var{context} carries encoding state from one +call to @code{scm_mb_iconv} to the next. Thus, successive calls to +@var{scm_mb_iconv} which use the same context object can convert a +stream of data one chunk at a time. + +If @var{inbuf} is zero or @code{*@var{inbuf}} is zero, then the call is +taken as a request to reset the states of the input and the output +encodings. If @var{outbuf} is non-zero and @code{*@var{outbuf}} is +non-zero, then @code{scm_mb_iconv} stores a byte sequence in the output +buffer to put the output encoding in its initial state. If the output +buffer is not large enough to hold this byte sequence, +@code{scm_mb_iconv} returns @code{scm_mb_iconv_too_big}, and leaves +the shift states of @var{context}'s input and output encodings +unchanged. + +The @code{scm_mb_iconv} function always consumes only complete +characters or shift sequences from the input buffer, and the output +buffer always contains a sequence of complete characters or escape +sequences. + +If the input sequence contains characters which are not expressible in +the output encoding, @code{scm_mb_iconv} converts it in an +implementation-defined way. It may simply delete the character. + +Some encodings use byte sequences which do not correspond to any textual +character. For example, the escape sequence of a stateful encoding has +no textual meaning. When converting from such an encoding, a call to +@code{scm_mb_iconv} might consume input but produce no output, since the +input sequence might contain only escape sequences. + +Normally, @code{scm_mb_iconv} returns the number of input characters it +could not convert perfectly to the ouput encoding. However, it may +return one of the @code{scm_mb_iconv_} codes described below, to +indicate an error. All of these codes are negative values. + +If the input sequence contains an invalid character encoding, conversion +stops before the invalid input character, and @code{scm_mb_iconv} +returns the constant value @code{scm_mb_iconv_bad_encoding}. + +If the input sequence ends with an incomplete character encoding, +@code{scm_mb_iconv} will leave it in the input buffer, unconsumed, and +return the constant value @code{scm_mb_iconv_incomplete_encoding}. This +is not necessarily an error, if you expect to call @code{scm_mb_iconv} +again with more data which might contain the rest of the encoding +fragment. + +If the output buffer does not contain enough room to hold the converted +form of the complete input text, @code{scm_mb_iconv} converts as much as +it can, changes the input and output pointers to reflect the amount of +text successfully converted, and then returns +@code{scm_mb_iconv_too_big}. +@end deftypefn + +Here are the status codes that might be returned by @code{scm_mb_iconv}. +They are all negative integers. +@table @code + +@item scm_mb_iconv_too_big +The conversion needs more room in the output buffer. Some characters +may have been consumed from the input buffer, and some characters may +have been placed in the available space in the output buffer. + +@item scm_mb_iconv_bad_encoding +@code{scm_mb_iconv} encountered an invalid character encoding in the +input buffer. Conversion stopped before the invalid character, so there +may be some characters consumed from the input buffer, and some +converted text in the output buffer. + +@item scm_mb_iconv_incomplete_encoding +The input buffer ends with an incomplete character encoding. The +incomplete encoding is left in the input buffer, unconsumed. This is +not necessarily an error, if you expect to call @code{scm_mb_iconv} +again with more data which might contain the rest of the incomplete +encoding. + +@end table + + +Finally, Guile provides a function for destroying conversion contexts. + +@deftypefn {Libguile Function} void scm_mb_iconv_close (struct scm_mb_iconv *@var{context}) +Deallocate the conversion context object @var{context}, and all other +resources allocated by the call to @code{scm_mb_iconv_open} which +returned @var{context}. +@end deftypefn + + +@node Implementing Your Own Text Conversions, , Exchanging Guile Text With the Outside World in C, Functions for Operating on Multibyte Text +@subsection Implementing Your Own Text Conversions + +[[note that conversions to and from Guile must produce streams +containing only valid character encodings, or else Guile will crash]] + +This section describes the interface for adding your own encoding +conversions for use with @code{scm_mb_iconv}. The interface here is +borrowed from the GNOME Project's @file{libunicode} library. + +Guile's @code{scm_mb_iconv} function works by converting the input text +to a stream of @code{scm_char_t} characters, and then converting +those characters to the desired output encoding. This makes it easy +for Guile to choose the appropriate conversion back ends for an +arbitrary pair of input and output encodings, but it also means that the +accuracy and quality of the conversions depends on the fidelity of +Guile's internal character set to the source and destination encodings. +Since @code{scm_mb_iconv} will be used almost exclusively for converting +to and from Guile's internal character set, this shouldn't be a problem. + +To add support for a particular encoding to Guile, you must provide one +function (called the @dfn{read} function) which converts from your +encoding to an array of @code{scm_char_t}'s, and another function +(called the @dfn{write} function) to convert from an array of +@code{scm_char_t}'s back into your encoding. To convert from some +encoding @var{a} to some other encoding @var{b}, Guile pairs up +@var{a}'s read function with @var{b}'s write function. Each call to +@code{scm_mb_iconv} passes text in encoding @var{a} through the read +function, to produce an array of @code{scm_char_t}'s, and then passes +that array to the write function, to produce text in encoding @var{b}. + +For stateful encodings, a read or write function can hang its own data +structures off the conversion object, and provide its own functions to +allocate and destroy them; this allows read and write functions to +maintain whatever state they like. + +The Guile conversion back end represents each available encoding with a +@code{struct scm_mb_encoding} object. + +@deftp {Libguile Type} {struct scm_mb_encoding} +This data structure describes an encoding. It has the following +members: + +@table @code + +@item char **names +An array of strings, giving the various names for this encoding. The +array should be terminated by a zero pointer. Case is not significant +in encoding names. + +The @code{scm_mb_iconv_open} function searches the list of registered +encodings for an encoding whose @code{names} array matches its +@var{tocode} or @var{fromcode} argument. + +@item int (*init) (void **@var{cookie}) +An initialization function for the encoding's private data. +@code{scm_mb_iconv_open} will call this function, passing it the address +of the cookie for this encoding in this context. (We explain cookies +below.) There is no way for the @code{init} function to tell whether +the encoding will be used for reading or writing. + +Note that @code{init} receives a @emph{pointer} to the cookie, not the +cookie itself. Because the type of @var{cookie} is @code{void **}, the +C compiler will not check it as carefully as it would other types. + +The @code{init} member may be zero, indicating that no initialization is +necessary for this encoding. + +@item int (*destroy) (void **@var{cookie}) +A deallocation function for the encoding's private data. +@code{scm_mb_iconv_close} calls this function, passing it the address of +the cookie for this encoding in this context. The @code{destroy} +function should free any data the @code{init} function allocated. + +Note that @code{destroy} receives a @emph{pointer} to the cookie, not the +cookie itself. Because the type of @var{cookie} is @code{void **}, the +C compiler will not check it as carefully as it would other types. + +The @code{destroy} member may be zero, indicating that this encoding +doesn't need to perform any special action to destroy its local data. + +@item int (*reset) (void *@var{cookie}, char **@var{outbuf}, size_t *@var{outbytesleft}) +Put the encoding into its initial shift state. Guile calls this +function whether the encoding is being used for input or output, so this +should take appropriate steps for both directions. If @var{outbuf} and +@var{outbytesleft} are valid, the reset function should emit an escape +sequence to reset the output stream to its initial state; @var{outbuf} +and @var{outbytesleft} should be handled just as for +@code{scm_mb_iconv}. + +This function can return an @code{scm_mb_iconv_} error code +(@pxref{Exchanging Guile Text With the Outside World in C}). If it +returns @code{scm_mb_iconv_too_big}, then the output buffer's shift +state must be left unchanged. + +Note that @code{reset} receives the cookie's value itself, not a pointer +to the cookie, as the @code{init} and @code{destroy} functions do. + +The @code{reset} member may be zero, indicating that this encoding +doesn't use a shift state. + +@item enum scm_mb_read_result (*read) (void *@var{cookie}, const char **@var{inbuf}, size_t *@var{inbytesleft}, scm_char_t **@var{outbuf}, size_t *@var{outcharsleft}) +Read some bytes and convert into an array of Guile characters. This is +the encoding's read function. + +On entry, there are *@var{inbytesleft} bytes of text at *@var{inbuf} to +be converted, and *@var{outcharsleft} characters available at +*@var{outbuf} to hold the results. + +On exit, *@var{inbytesleft} and *@var{inbuf} indicate the input bytes +still not consumed. *@var{outcharsleft} and *@var{outbuf} indicate the +output buffer space still not filled. (By exclusion, these indicate +which input bytes were consumed, and which output characters were +produced.) + +Return one of the @code{enum scm_mb_read_result} values, described below. + +Note that @code{read} receives the cookie's value itself, not a pointer +to the cookie, as the @code{init} and @code{destroy} functions do. + +@item enum scm_mb_write_result (*write) (void *@var{cookie}, scm_char_t **@var{inbuf}, size_t *@var{incharsleft}, **@var{outbuf}, size_t *@var{outbytesleft}) +Convert an array of Guile characters to output bytes. This is +the encoding's write function. + +On entry, there are *@var{incharsleft} Guile characters available at +*@var{inbuf}, and *@var{outbytesleft} bytes available to store output at +*@var{outbuf}. + +On exit, *@var{incharsleft} and *@var{inbuf} indicate the number of +Guile characters left unconverted (because there was insufficient room +in the output buffer to hold their converted forms), and +*@var{outbytesleft} and *@var{outbuf} indicate the unused portion of the +output buffer. + +Return one of the @code{scm_mb_write_result} values, described below. + +Note that @code{write} receives the cookie's value itself, not a pointer +to the cookie, as the @code{init} and @code{destroy} functions do. + +@item struct scm_mb_encoding *next +This is used by Guile to maintain a linked list of encodings. It is +filled in when you call @code{scm_mb_register_encoding} to add your +encoding to the list. + +@end table +@end deftp + +Here is the enumerated type for the values an encoding's read function +can return: + +@deftp {Libguile Type} {enum scm_mb_read_result} +This type represents the result of a call to an encoding's read +function. It has the following values: + +@table @code + +@item scm_mb_read_ok +The read function consumed at least one byte of input. + +@item scm_mb_read_incomplete +The data present in the input buffer does not contain a complete +character encoding. No input was consumed, and no characters were +produced as output. This is not necessarily an error status, if there +is more data to pass through. + +@item scm_mb_read_error +The input contains an invalid character encoding. + +@end table +@end deftp + +Here is the enumerated type for the values an encoding's write function +can return: + +@deftp {Libguile Type} {enum scm_mb_write_result} +This type represents the result of a call to an encoding's write +function. It has the following values: + +@table @code + +@item scm_mb_write_ok +The write function was able to convert all the characters in @var{inbuf} +successfully. + +@item scm_mb_write_too_big +The write function filled the output buffer, but there are still +characters in @var{inbuf} left unconsumed; @var{inbuf} and +@var{incharsleft} indicate the unconsumed portion of the input buffer. + +@end table +@end deftp + + +Conversions to or from stateful encodings need to keep track of each +encoding's current state. Each conversion context contains two +@code{void *} variables called @dfn{cookies}, one for the input +encoding, and one for the output encoding. These cookies are passed to +the encodings' functions, for them to use however they please. A +stateful encoding can use its cookie to hold a pointer to some object +which maintains the context's current shift state. Stateless encodings +will probably not use their cookies. + +The cookies' lifetime is the same as that of the context object. When +the user calls @code{scm_mb_iconv_close} to destroy a context object, +@code{scm_mb_iconv_close} calls the input and output encodings' +@code{destroy} functions, passing them their respective cookies, so each +encoding can free any data it allocated for that context. + +Note that, if a read or write function returns a successful result code +like @code{scm_mb_read_ok} or @code{scm_mb_write_ok}, then the remaining +input, together with the output, must together represent the complete +input text; the encoding may not store any text temporarily in its +cookie. This is because, if @code{scm_mb_iconv} returns a successful +result to the user, it is correct for the user to assume that all the +consumed input has been converted and placed in the output buffer. +There is no ``flush'' operation to push any final results out of the +encodings' buffers. + +Here is the function you call to register a new encoding with the +conversion system: + +@deftypefn {Libguile Function} void scm_mb_register_encoding (struct scm_mb_encoding *@var{encoding}) +Add the encoding described by @code{*@var{encoding}} to the set +understood by @code{scm_mb_iconv_open}. Once you have registered your +encoding, you can use it by calling @code{scm_mb_iconv_open} with one of +the names in @code{@var{encoding}->names}. +@end deftypefn + + +@node Multibyte Text Processing Errors, Why Guile Does Not Use a Fixed-Width Encoding, Functions for Operating on Multibyte Text, Working With Multibyte Strings in C +@section Multibyte Text Processing Errors + +This section describes error conditions which code can signal to +indicate problems encountered while processing multibyte text. In each +case, the arguments @var{message} and @var{args} are an error format +string and arguments to be substituted into the string, as accepted by +the @code{display-error} function. + +@deffn Condition text:not-char-boundary func message args object offset +By calling @var{func}, the program attempted to access a character at +byte offset @var{offset} in the Guile object @var{object}, but +@var{offset} is not the start of a character's encoding in @var{object}. + +Typically, @var{object} is a string or symbol. If the function signalling +the error cannot find the Guile object that contains the text it is +inspecting, it should use @code{#f} for @var{object}. +@end deffn + +@deffn Condition text:bad-encoding func message args object +By calling @var{func}, the program attempted to interpret the text in +@var{object}, but @var{object} contains a byte sequence which is not a +valid encoding for any character. +@end deffn + +@deffn Condition text:not-guile-char func message args number +By calling @var{func}, the program attempted to treat @var{number} as the +number of a character in the Guile character set, but @var{number} does +not correspond to any character in the Guile character set. +@end deffn + +@deffn Condition text:unknown-conversion func message args from to +By calling @var{func}, the program attempted to convert from an encoding +named @var{from} to an encoding named @var{to}, but Guile does not +support such a conversion. +@end deffn + +@deftypevr {Libguile Variable} SCM scm_text_not_char_boundary +@deftypevrx {Libguile Variable} SCM scm_text_bad_encoding +@deftypevrx {Libguile Variable} SCM scm_text_not_guile_char +These variables hold the scheme symbol objects whose names are the +condition symbols above. You can use these when signalling these +errors, instead of looking them up yourself. +@end deftypevr + + +@node Why Guile Does Not Use a Fixed-Width Encoding, , Multibyte Text Processing Errors, Working With Multibyte Strings in C +@section Why Guile Does Not Use a Fixed-Width Encoding + +Multibyte encodings are clumsier to work with than encodings which use a +fixed number of bytes for every character. For example, using a +fixed-width encoding, we can extract the @var{i}th character of a string +in constant time, and we can always substitute the @var{i}th character +of a string with any other character without reallocating or copying the +string. + +However, there are no fixed-width encodings which include the characters +we wish to include, and also fit in a reasonable amount of space. +Despite the Unicode standard's claims to the contrary, Unicode is not +really a fixed-width encoding. Unicode uses surrogate pairs to +represent characters outside the 16-bit range; a surrogate pair must be +treated as a single character, but occupies two 16-bit spaces. As of +this writing, there are already plans to assign characters to the +surrogate character codes. Three- and four-byte encodings are +too wasteful for a majority of Guile's users, who only need @sc{ASCII} +and a few accented characters. + +Another alternative would be to have several different fixed-width +string representations, each with a different element size. For each +string, Guile would use the smallest element size capable of +accomodating the string's text. This would allow users of English and +the Western European languages to use the traditional memory-efficient +encodings. However, if Guile has @var{n} string representations, then +users must write @var{n} versions of any code which manipulates text +directly --- one for each element size. And if a user wants to operate +on two strings simultaneously, and wants to avoid testing the string +sizes within the loop, she must make @var{n}*@var{n} copies of the loop. +Most users will simply not bother. Instead, they will write code which +supports only one string size, leaving us back where we started. By +using a single internal representation, Guile makes it easier for users +to write multilingual code. + +[[What about tagging each string with its encoding? +"Every extension must be written to deal with every encoding"]] + +[[You don't really want to index strings anyway.]] + +Finally, Guile's multibyte encoding is not so bad. Unlike a two- or +four-byte encoding, it is efficient in space for American and European +users. Furthermore, the properties described above mean that many +functions can be coded just as they would for a single-byte encoding; +see @ref{Promised Properties of the Guile Multibyte Encoding}. + +@bye diff --git a/guile18/doc/mltext.texi b/guile18/doc/mltext.texi new file mode 100644 index 0000000000..73071f501a --- /dev/null +++ b/guile18/doc/mltext.texi @@ -0,0 +1,146 @@ +@node Working with Multilingual Text +@chapter Working with Multilingual Text + +@node Guile Character Properties, Exchanging Text With The Outside World, Multibyte String Functions, Functions for Operating on Multibyte Text +@section Guile Character Properties + +These functions give information about the nature of a given Guile +character. These are defined for any @code{scm_mb_char_t} value. + +@deftypefn {Libguile Function} int scm_mb_isalnum (scm_mb_char_t @var{c}) +Return non-zero iff @var{c} is an alphabetic or numeric character. +@end deftypefn + +@deftypefn {Libguile Function} int scm_mb_is_alpha (scm_mb_char_t @var{c}) +Return non-zero iff @var{c} is an alphabetic character. +@end deftypefn + +@deftypefn {Libguile Function} int scm_mb_iscntrl (scm_mb_char_t @var{c}) +Return non-zero iff @var{c} is a control character. +@end deftypefn + +@deftypefn {Libguile Function} int scm_mb_isdigit (scm_mb_char_t @var{c}) +Return non-zero iff @var{c} is a digit. +@end deftypefn + +@deftypefn {Libguile Function} int scm_mb_isgraph (scm_mb_char_t @var{c}) +Return non-zero iff @var{c} is a visible character. +@end deftypefn + +@deftypefn {Libguile Function} int scm_mb_isupper (scm_mb_char_t @var{c}) +Return non-zero iff @var{c} is an upper-case character. +@end deftypefn + +@deftypefn {Libguile Function} int scm_mb_islower (scm_mb_char_t @var{c}) +Return non-zero iff @var{c} is a lower-case character. +@end deftypefn + +@deftypefn {Libguile Function} int scm_mb_istitle (scm_mb_char_t @var{c}) +Return non-zero iff @var{c} is a title-case character. See the Unicode +standard for an explanation of title case. +@end deftypefn + +@deftypefn {Libguile Function} int scm_mb_isprint (scm_mb_char_t @var{c}) +Return non-zero iff @var{c} is a printable character. +@end deftypefn + +@deftypefn {Libguile Function} int scm_mb_ispunct (scm_mb_char_t @var{c}) +Return non-zero iff @var{c} is a punctuation character. +@end deftypefn + +@deftypefn {Libguile Function} int scm_mb_isspace (scm_mb_char_t @var{c}) +Return non-zero iff @var{c} is a whitespace character. +@end deftypefn + +@deftypefn {Libguile Function} int scm_mb_isxdigit (scm_mb_char_t @var{c}) +Return non-zero iff @var{c} is a hexadecimal digit. +@end deftypefn + +@deftypefn {Libguile Function} int scm_mb_isdefined (scm_mb_char_t @var{c}) +Return non-zero iff @var{c} is a valid character. +@end deftypefn + +@deftypefn {Libguile Function} scm_mb_char_t scm_mb_char_toupper (scm_mb_char_t @var{c}) +@deftypefnx {Libguile Function} scm_mb_char_t scm_mb_char_tolower (scm_mb_char_t @var{c}) +@deftypefnx {Libguile Function} scm_mb_char_t scm_mb_char_totitle (scm_mb_char_t @var{c}) +Convert @var{c} to upper, lower, or title case. If @var{c} has no +equivalent in the requested case, or is already in that case, return it +unchanged. +@end deftypefn + +@deftypefn {Libguile Function} in scm_mb_digit_value (scm_mb_char_t @var{c}) +If @var{c} is a hexadecimal digit (according to +@code{scm_mb_isxdigit}), then return its numeric value. Otherwise +return -1. +@end deftypefn + +@deftypefn {Libguile Function} in scm_mb_digit_value (scm_mb_char_t @var{c}) +If @var{c} is a digit (according to @code{scm_mb_isdigit}), then +return its numeric value. Otherwise return -1. +@end deftypefn + + +@node Multibyte Character Tables, Multibyte Character Categories, Exchanging Text With The Outside World, Functions for Operating on Multibyte Text +@section Multibyte Character Tables + +A @dfn{character table} is a table mapping @code{scm_mb_char_t} values +onto Guile objects. Guile provides functions for creating character +tables, setting entries, and looking up characters. Character tables +are Guile objects, so they are managed by Guile's garbage collector. + +A character table can have a ``parent'' table, from which it inherits +values for characters. If a character table @var{child}, with a parent +table @var{parent} maps some character @var{c} to the value +@code{SCM_UNDEFINED}, then @code{scm_c_char_table_ref (@var{child}, +@var{c})} will look up @var{c} in @var{parent}, and return the value it +finds there. + +This section describes only the C API for working with character tables. +For the Scheme-level API, see @ref{some other section}. + +@deftypefn {Libguile Function} scm_make_char_table (SCM @var{init}, SCM @var{parent}) +Return a new character table object which maps every character to +@var{init}. If @var{parent} is a character table, then @var{parent} is +the new table's parent. If @var{parent} table is @code{SCM_UNDEFINED}, +then the new table has no parent. Otherwise, signal a type error. +@end deffn + +@deftypefn {Libguile Function} SCM scm_c_char_table_ref (SCM @var{table}, scm_mb_char_t @var{c}) +Look up the character @var{c} in the character table @var{table}, and +return the value found there. If @var{table} maps @var{c} to +@code{SCM_UNDEFINED}, and @var{table} has a parent, then look up @var{c} +in the parent. + +If @var{table} is not a character table, signal an error. +@end deftypefn + +@deftypefn {Libguile Function} SCM scm_c_char_table_set_x (SCM @var{table}, scm_mb_char_t @var{c}, SCM @var{value}) +Set @var{table}'s value for the character @var{c} to @var{value}. +If @var{value} is @code{SCM_UNDEFINED}, then @var{table}'s parent's +value will show through for @var{c}. + +If @var{table} is not a character table, signal an error. + +This function changes only @var{table} itself, never @var{table}'s +parent. +@end deftypefn + +[[this is all wrong. what about default values?]] + + + + + +@node Multibyte Character Categories, , Multibyte Character Tables, Functions for Operating on Multibyte Text +@section Multibyte Character Categories + +[[This will describe an ADT representing subsets of the Guile character +set.]] + + + + +@node Exchanging Guile Text With the Outside World +@subsection Exchanging Guile Text With the Outside World + +[[Scheme-level functions for converting between encodings]] diff --git a/guile18/doc/oldfmt.c b/guile18/doc/oldfmt.c new file mode 100644 index 0000000000..fc82ba92af --- /dev/null +++ b/guile18/doc/oldfmt.c @@ -0,0 +1,193 @@ +/* Copyright (C) 2000,2001, 2006, 2008 Free Software Foundation, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + + + +/* From NEWS: + * + * * New primitive: `simple-format', affects `scm-error', scm_display_error, & scm_error message strings + * + * (ice-9 boot) makes `format' an alias for `simple-format' until possibly + * extended by the more sophisticated version in (ice-9 format) + * + * (simple-format port message . args) + * Write MESSAGE to DESTINATION, defaulting to `current-output-port'. + * MESSAGE can contain ~A (was %s) and ~S (was %S) escapes. When printed, + * the escapes are replaced with corresponding members of ARGS: + * ~A formats using `display' and ~S formats using `write'. + * If DESTINATION is #t, then use the `current-output-port', + * if DESTINATION is #f, then return a string containing the formatted text. + * Does not add a trailing newline." + * + * The two C procedures: scm_display_error and scm_error, as well as the + * primitive `scm-error', now use scm_format to do their work. This means + * that the message strings of all code must be updated to use ~A where %s + * was used before, and ~S where %S was used before. + * + * During the period when there still are a lot of old Guiles out there, + * you might want to support both old and new versions of Guile. + * + * There are basically two methods to achieve this. Both methods use + * autoconf. Put + * + * AC_CHECK_FUNCS(scm_simple_format) + * + * in your configure.in. + * + * Method 1: Use the string concatenation features of ANSI C's + * preprocessor. + * + * In C: + * + * #ifdef HAVE_SCM_SIMPLE_FORMAT + * #define FMT_S "~S" + * #else + * #define FMT_S "%S" + * #endif + * + * Then represent each of your error messages using a preprocessor macro: + * + * #define E_SPIDER_ERROR "There's a spider in your " ## FMT_S ## "!!!" + * + * In Scheme: + * + * (define fmt-s (if (defined? 'simple-format) "~S" "%S")) + * (define make-message string-append) + * + * (define e-spider-error + * (make-message "There's a spider in your " fmt-s "!!!")) + * + * Method 2: Use the oldfmt function found in doc/oldfmt.c. + * + * In C: + * + * scm_misc_error ("picnic", scm_c_oldfmt0 ("There's a spider in your ~S!!!"), + * ...); + * + * In Scheme: + * + * (scm-error 'misc-error "picnic" (oldfmt "There's a spider in your ~S!!!") + * ...) + * + */ + +/* + * Take a format string FROM adhering to the new standard format (~A and ~S + * as placeholders) of length N and return a string which is adapted + * to the format used by the Guile interpreter which you are running. + * + * On successive calls with similar strings but different storage, the + * same string with same storage is returned. This is necessary since + * the existence of a garbage collector in the system may cause the same + * format string to be represented with different storage at different + * calls. + */ + +char * +scm_c_oldfmt (char *from, int n) +{ +#ifdef HAVE_SCM_SIMPLE_FORMAT + return from; +#else + static struct { int n; char *from; char *to; } *strings; + static int size = 0; + static int n_strings = 0; + char *to; + int i; + + for (i = 0; i < n_strings; ++i) + if (n == strings[i].n && strncmp (from, strings[i].from, n) == 0) + return strings[i].to; + + if (n_strings == size) + { + if (size == 0) + { + size = 10; + strings = scm_must_malloc (size * sizeof (*strings), s_oldfmt); + } + else + { + int oldsize = size; + size = 3 * oldsize / 2; + strings = scm_must_realloc (strings, + oldsize * sizeof (*strings), + size * sizeof (*strings), + s_oldfmt); + } + } + + strings[n_strings].n = n; + strings[n_strings].from = strncpy (scm_must_malloc (n, s_oldfmt), from, n); + to = strings[n_strings].to = scm_must_malloc (n + 1, s_oldfmt); + n_strings++; + + for (i = 0; i < n; ++i) + { + if (from[i] == '~' && ++i < n) + { + if (from[i] == 'A') + { + to[i - 1] = '%'; + to[i] = 's'; + } + else if (from[i] == 'S') + { + to[i - 1] = '%'; + to[i] = 'S'; + } + else + { + to[i - 1] = '~'; + to[i] = from[i]; + } + continue; + } + to[i] = from[i]; + } + to[i] = '\0'; + + return to; +#endif +} + +char * +scm_c_oldfmt0 (char *s) +{ +#ifdef HAVE_SCM_SIMPLE_FORMAT + return s; +#else + return scm_c_oldfmt (s, strlen (s)); +#endif +} + +SCM_PROC (s_oldfmt, "oldfmt", 1, 0, 0, scm_oldfmt); + +SCM +scm_oldfmt (SCM s) +{ +#ifdef HAVE_SCM_SIMPLE_FORMAT + return s; +#else + int n; + SCM_ASSERT (SCM_NIMP (s) && SCM_STRINGP (s), s, 1, s_oldfmt); + n = SCM_LENGTH (s); + return scm_return_first (scm_mem2string (scm_c_oldfmt (SCM_ROCHARS (s), n), + n), + s); +#endif +} diff --git a/guile18/doc/r5rs/ChangeLog-2008 b/guile18/doc/r5rs/ChangeLog-2008 new file mode 100644 index 0000000000..b5e4e9a3c2 --- /dev/null +++ b/guile18/doc/r5rs/ChangeLog-2008 @@ -0,0 +1,17 @@ +2004-11-05 Marius Vollmer + + * r5rs.texi: Use @ifnottex instead of @ifinfo around the "Top" + node declaration so that html can be generated. Use only lower + case inside @sc. Move editors outside of author table, which + looks better in html. + +2001-08-27 Neil Jerram + + * Makefile.am (TEXINFO_TEX): Added; avoids shipping multiple copies of + texinfo.tex in a single distribution. + +2001-08-27 Neil Jerram + + The change log for files in this directory continues backwards + from 2001-08-27 in ../ChangeLog, as all the Guile documentation + prior to this date was contained in a single directory. diff --git a/guile18/doc/r5rs/Makefile.am b/guile18/doc/r5rs/Makefile.am new file mode 100644 index 0000000000..4af0c951a4 --- /dev/null +++ b/guile18/doc/r5rs/Makefile.am @@ -0,0 +1,26 @@ +## Process this file with Automake to create Makefile.in +## +## Copyright (C) 1998, 2006, 2008 Free Software Foundation, Inc. +## +## This file is part of GUILE. +## +## GUILE is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as +## published by the Free Software Foundation; either version 2, or +## (at your option) any later version. +## +## GUILE is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public +## License along with GUILE; see the file COPYING. If not, write +## to the Free Software Foundation, Inc., 51 Franklin Street, Fifth +## Floor, Boston, MA 02110-1301 USA + +AUTOMAKE_OPTIONS = gnu + +info_TEXINFOS = r5rs.texi + +EXTRA_DIST = ChangeLog-2008 diff --git a/guile18/doc/r5rs/r5rs.texi b/guile18/doc/r5rs/r5rs.texi new file mode 100644 index 0000000000..605a9762d3 --- /dev/null +++ b/guile18/doc/r5rs/r5rs.texi @@ -0,0 +1,8537 @@ +\input texinfo @c -*-texinfo-*- +@c %**start of header +@setfilename r5rs.info +@settitle Revised(5) Scheme + +@c This copy of r5rs.texi differs from Aubrey Jaffer's master copy +@c by a set of changes to allow the building of r5rs.dvi from r5rs.texi. +@c Aubrey Jaffer's view - which I agree with - is that, given that +@c people have the option of building r5rs.dvi from the original +@c LaTeX distribution for R5RS, it is not worth fixing his master +@c copy of r5rs.texi and the tool which autogenerates it. On the +@c other hand, it is a marginal convenience for people to be able to +@c build hardcopy from r5rs.texi, even if the results are less good +@c than with the original LaTeX. Hence the following fixes. +@c (lines 714, 725, 728, 1614, 2258): Remove invalid parentheses from +@c @deffn statements. +@c (line 2316): Change @deffnx to @deffn, and insert `@end deffn' to +@c terminate preceding @deffn. +@c (line 7320): Insert `@c ' at beginning of lines that are intended +@c to be @ignore'd. +@c +@c NJ 2001/1/26 + +@c \documentclass[twoside]{algol60} + +@c \pagestyle{headings} +@c \showboxdepth=0 + + + +@c \def\headertitle{Revised$^{5}$ Scheme} +@c \def\integerversion{5} + +@c Sizes and dimensions + +@c \topmargin -.375in % Nominal distance from top of page to top of + +@c box containing running head. +@c \headsep 15pt % Space between running head and text. + +@c \textheight 663pt % Height of text (including footnotes and figures, + +@c excluding running head and foot). + +@c \textwidth 523pt % Width of text line. +@c \columnsep 15pt % Space between columns +@c \columnseprule 0pt % Width of rule between columns. + +@c \parskip 5pt plus 2pt minus 2pt % Extra vertical space between paragraphs. +@c \parindent 0pt % Width of paragraph indentation. +@c \topsep 0pt plus 2pt % Extra vertical space, in addition to + +@c \parskip, added above and below list and + +@c paragraphing environments. + +@c \oddsidemargin -.5in % Left margin on odd-numbered pages. +@c \evensidemargin -.5in % Left margin on even-numbered pages. + +@c % End of sizes and dimensions + +@paragraphindent 0 +@c %**end of header +@c syncodeindex fn cp + +@ifinfo +@dircategory The Algorithmic Language Scheme +@direntry +* R5RS: (r5rs). The Revised(5) Report on Scheme. +@end direntry +@end ifinfo + + +@c \parindent 0pt %!! 15pt % Width of paragraph indentation. + + @b{20 February 1998} +@c \hfil \today{} + +@c @include{first} +@titlepage + +@c HTML first page +@title Scheme +@subtitle Revised(5) Report on the Algorithmic Language Scheme +@c First page + +@c \thispagestyle{empty} + +@c \todo{"another" report?} + + +@author R@sc{ICHARD} K@sc{ELSEY}, W@sc{ILLIAM} C@sc{LINGER, AND} J@sc{ONATHAN} R@sc{EES} (@i{Editors}) +@author H. A@sc{BELSON} +@author R. K. D@sc{YBVIG} +@author C. T. H@sc{AYNES} +@author G. J. R@sc{OZAS} +@author N. I. A@sc{DAMS IV} +@author D. P. F@sc{RIEDMAN} +@author E. K@sc{OHLBECKER} +@author G. L. S@sc{TEELE} J@sc{R}. +@author D. H. B@sc{ARTLEY} +@author R. H@sc{ALSTEAD} +@author D. O@sc{XLEY} +@author G. J. S@sc{USSMAN} +@author G. B@sc{ROOKS} +@author C. H@sc{ANSON} +@author K. M. P@sc{ITMAN} +@author M. W@sc{AND} +@author + + +@c {\it Dedicated to the Memory of ALGOL 60} +@i{Dedicated to the Memory of Robert Hieb} +@c [For the macros in R5RS -RK] + + + + +@unnumbered Summary + + +The report gives a defining description of the programming language +Scheme. Scheme is a statically scoped and properly tail-recursive +dialect of the Lisp programming language invented by Guy Lewis +Steele Jr.@: and Gerald Jay Sussman. It was designed to have an +exceptionally clear and simple semantics and few different ways to +form expressions. A wide variety of programming paradigms, including +imperative, functional, and message passing styles, find convenient +expression in Scheme. + +The introduction offers a brief history of the language and of +the report. + +The first three chapters present the fundamental ideas of the +language and describe the notational conventions used for describing the +language and for writing programs in the language. + +Chapters @ref{Expressions} and @ref{Program structure} describe +the syntax and semantics of expressions, programs, and definitions. + +Chapter @ref{Standard procedures} describes Scheme's built-in +procedures, which include all of the language's data manipulation and +input/output primitives. + +Chapter @ref{Formal syntax and semantics} provides a formal syntax for Scheme +written in extended BNF, along with a formal denotational semantics. +An example of the use of the language follows the formal syntax and +semantics. + +The report concludes with a list of references and an +alphabetic index. + +@ignore todo +expand the summary so that it fills up the column. +@end ignore + + +@c \vfill +@c \begin{center} +@c {\large \bf +@c *** DRAFT*** \\ +@c %August 31, 1989 +@c \today +@c }\end{center} + + + + + +@c \addvspace{3.5pt} % don't shrink this gap +@c \renewcommand{\tocshrink}{-3.5pt} % value determined experimentally + + + + + + +@page + +@end titlepage + +@c INFO first page +@ifnottex + +@c First page + +@c \thispagestyle{empty} + +@c \todo{"another" report?} + + +@node top, Introduction, (dir), (dir) +@top Revised(5) Report on the Algorithmic Language Scheme + +@sp 1 + + +@quotation +R@sc{ichard} K@sc{elsey}, W@sc{illiam} C@sc{linger, and} J@sc{onathan} R@sc{ees} (@i{Editors}) +@sp 1 +@multitable @columnfractions 0.25 0.25 0.25 0.25 +@item H. A@sc{belson} @tab R. K. D@sc{ybvig} @tab C. T. H@sc{aynes} @tab G. J. R@sc{ozas} +@item N. I. A@sc{dams IV} @tab D. P. F@sc{riedman} @tab E. K@sc{ohlbecker} @tab G. L. S@sc{teele} J@sc{r}. +@item D. H. B@sc{artley} @tab R. H@sc{alstead} @tab D. O@sc{xley} @tab G. J. S@sc{ussman} +@item G. B@sc{rooks} @tab C. H@sc{anson} @tab K. M. P@sc{itman} @tab M. W@sc{and} +@item +@end multitable +@end quotation + + +@sp 2 + +@c {\it Dedicated to the Memory of ALGOL 60} +@i{Dedicated to the Memory of Robert Hieb} +@c [For the macros in R5RS -RK] + +@sp 3 + + + + +@majorheading Summary + + +The report gives a defining description of the programming language +Scheme. Scheme is a statically scoped and properly tail-recursive +dialect of the Lisp programming language invented by Guy Lewis +Steele Jr.@: and Gerald Jay Sussman. It was designed to have an +exceptionally clear and simple semantics and few different ways to +form expressions. A wide variety of programming paradigms, including +imperative, functional, and message passing styles, find convenient +expression in Scheme. + +The introduction offers a brief history of the language and of +the report. + +The first three chapters present the fundamental ideas of the +language and describe the notational conventions used for describing the +language and for writing programs in the language. + +Chapters @ref{Expressions} and @ref{Program structure} describe +the syntax and semantics of expressions, programs, and definitions. + +Chapter @ref{Standard procedures} describes Scheme's built-in +procedures, which include all of the language's data manipulation and +input/output primitives. + +Chapter @ref{Formal syntax and semantics} provides a formal syntax for Scheme +written in extended BNF, along with a formal denotational semantics. +An example of the use of the language follows the formal syntax and +semantics. + +The report concludes with a list of references and an +alphabetic index. + +@ignore todo +expand the summary so that it fills up the column. +@end ignore + + +@c \vfill +@c \begin{center} +@c {\large \bf +@c *** DRAFT*** \\ +@c %August 31, 1989 +@c \today +@c }\end{center} + + + + + +@c \addvspace{3.5pt} % don't shrink this gap +@c \renewcommand{\tocshrink}{-3.5pt} % value determined experimentally + +@unnumbered Contents + +@menu +* Introduction:: +* Overview of Scheme:: +* Lexical conventions:: +* Basic concepts:: +* Expressions:: +* Program structure:: +* Standard procedures:: +* Formal syntax and semantics:: +* Notes:: +* Additional material:: +* Example:: +* Bibliography:: +* Index:: +@end menu + + + + + +@page + +@end ifnottex + + +@c @include{intro} +@node Introduction, Overview of Scheme, top, top +@unnumbered Introduction + +@menu +* Background:: +* Acknowledgements:: +@end menu + + + + +Programming languages should be designed not by piling feature on top of +feature, but by removing the weaknesses and restrictions that make additional +features appear necessary. Scheme demonstrates that a very small number +of rules for forming expressions, with no restrictions on how they are +composed, suffice to form a practical and efficient programming language +that is flexible enough to support most of the major programming +paradigms in use today. + +@c Scheme has influenced the evolution of Lisp. +Scheme +was one of the first programming languages to incorporate first class +procedures as in the lambda calculus, thereby proving the usefulness of +static scope rules and block structure in a dynamically typed language. +Scheme was the first major dialect of Lisp to distinguish procedures +from lambda expressions and symbols, to use a single lexical +environment for all variables, and to evaluate the operator position +of a procedure call in the same way as an operand position. By relying +entirely on procedure calls to express iteration, Scheme emphasized the +fact that tail-recursive procedure calls are essentially goto's that +pass arguments. Scheme was the first widely used programming language to +embrace first class escape procedures, from which all previously known +sequential control structures can be synthesized. A subsequent +version of Scheme introduced the concept of exact and inexact numbers, +an extension of Common Lisp's generic arithmetic. +More recently, Scheme became the first programming language to support +hygienic macros, which permit the syntax of a block-structured language +to be extended in a consistent and reliable manner. +@c A few +@c of these innovations have recently been incorporated into Common Lisp, while +@c others remain to be adopted. + +@ignore todo +Ramsdell: +I would like to make a few comments on presentation. The most +important comment is about section organization. Newspaper writers +spend most of their time writing the first three paragraphs of any +article. This part of the article is often the only part read by +readers, and is important in enticing readers to continue. In the +same way, The first page is most likely to be the only page read by +many SIGPLAN readers. If I had my choice of what I would ask them to +read, it would be the material in section 1.1, the Semantics section +that notes that scheme is lexically scoped, tail recursive, weakly +typed, ... etc. I would expand on the discussion on continuations, +as they represent one important difference between Scheme and other +languages. The introduction, with its history of scheme, its history +of scheme reports and meetings, and acknowledgements giving names of +people that the reader will not likely know, is not that one page I +would like all to read. I suggest moving the history to the back of +the report, and use the first couple of pages to convince the reader +that the language documented in this report is worth studying. + +@end ignore + + +@node Background, Acknowledgements, Introduction, Introduction +@unnumberedsec Background + + +The first description of Scheme was written in +1975 [Scheme75]. A revised report [Scheme78] +@ignore todo +italicize or not? +@end ignore + appeared in 1978, which described the evolution +of the language as its MIT implementation was upgraded to support an +innovative compiler [Rabbit]. Three distinct projects began in +1981 and 1982 to use variants of Scheme for courses at MIT, Yale, and +Indiana University [Rees82], [MITScheme], [Scheme311]. An introductory +computer science textbook using Scheme was published in +1984 [SICP]. + +@c \vest As might be expected of a language used primarily for education and +@c research, Scheme has always evolved rapidly. This was no problem when +@c Scheme was used only within MIT, but +As Scheme became more widespread, +local dialects began to diverge until students and researchers +occasionally found it difficult to understand code written at other +sites. +Fifteen representatives of the major implementations of Scheme therefore +met in October 1984 to work toward a better and more widely accepted +standard for Scheme. +@c Participating in this workshop were Hal Abelson, Norman Adams, David +@c Bartley, Gary Brooks, William Clinger, Daniel Friedman, Robert Halstead, +@c Chris Hanson, Christopher Haynes, Eugene Kohlbecker, Don Oxley, Jonathan Rees, +@c Guillermo Rozas, Gerald Jay Sussman, and Mitchell Wand. Kent Pitman +@c made valuable contributions to the agenda for the workshop but was +@c unable to attend the sessions. + +@c Subsequent electronic mail discussions and committee work completed the +@c definition of the language. +@c Gerry Sussman drafted the section on numbers, Chris Hanson drafted the +@c sections on characters and strings, and Gary Brooks and William Clinger +@c drafted the sections on input and output. +@c William Clinger recorded the decisions of the workshop and +@c compiled the pieces into a coherent document. +@c The ``Revised revised report on Scheme''~\cite{RRRS} +Their report [RRRS] +was published at MIT and Indiana University in the summer of 1985. +Further revision took place in the spring of 1986 [R3RS], +@c , again accomplished +@c almost entirely by electronic mail, resulted in the present report. +and in the spring of 1988 [R4RS]. +The present report reflects further revisions agreed upon in a meeting +at Xerox PARC in June 1992. + +@c \vest The number 3 in the title is part of the title, not a reference to +@c a footnote. The word ``revised'' is raised to the third power because +@c the report is a revision of a report that was already twice revised. + +@ignore todo +Write an editors' note? +@end ignore + + + +@sp 3 + +We intend this report to belong to the entire Scheme community, and so +we grant permission to copy it in whole or in part without fee. In +particular, we encourage implementors of Scheme to use this report as +a starting point for manuals and other documentation, modifying it as +necessary. + + + + +@node Acknowledgements, , Background, Introduction +@unnumberedsec Acknowledgements + + +We would like to thank the following people for their help: Alan Bawden, Michael +Blair, George Carrette, Andy Cromarty, Pavel Curtis, Jeff Dalton, Olivier Danvy, +Ken Dickey, Bruce Duba, Marc Feeley, +Andy Freeman, Richard Gabriel, Yekta G"ursel, Ken Haase, Robert +Hieb, Paul Hudak, Morry Katz, Chris Lindblad, Mark Meyer, Jim Miller, Jim Philbin, +John Ramsdell, Mike Shaff, Jonathan Shapiro, Julie Sussman, +Perry Wagle, Daniel Weise, Henry Wu, and Ozan Yigit. +We thank Carol Fessenden, Daniel +Friedman, and Christopher Haynes for permission to use text from the Scheme 311 +version 4 reference manual. We thank Texas Instruments, Inc. for permission to +use text from the @emph{TI Scheme Language Reference Manual}[TImanual85]. +We gladly acknowledge the influence of manuals for MIT Scheme[MITScheme], +T[Rees84], Scheme 84[Scheme84],Common Lisp[CLtL], +and Algol 60[Naur63]. + +We also thank Betty Dexter for the extreme effort she put into +setting this report in @TeX{}, and Donald Knuth for designing the program +that caused her troubles. + +The Artificial Intelligence Laboratory of the +Massachusetts Institute of Technology, the Computer Science +Department of Indiana University, the Computer and Information +Sciences Department of the University of Oregon, and the NEC Research +Institute supported the preparation of this report. Support for the MIT +work was provided in part by +the Advanced Research Projects Agency of the Department of Defense under Office +of Naval Research contract N00014-80-C-0505. Support for the Indiana +University work was provided by NSF grants NCS 83-04567 and NCS +83-03325. + + + + +@sp 2 + +@c \clearchapterstar{Description of the language} %\unskip\vskip -2ex +@c @include{struct} + +@c 1. Structure of the language + +@node Overview of Scheme, Lexical conventions, Introduction, top +@chapter Overview of Scheme + +@menu +* Semantics:: +* Syntax:: +* Notation and terminology:: +@end menu + + +@node Semantics, Syntax, Overview of Scheme, Overview of Scheme +@section Semantics + + + +This section gives an overview of Scheme's semantics. A +detailed informal semantics is the subject of +chapters @ref{Basic concepts} through @ref{Standard procedures}. For reference +purposes, section @ref{Formal semantics} provides a formal +semantics of Scheme. + +Following Algol, Scheme is a statically scoped programming +language. Each use of a variable is associated with a lexically +apparent binding of that variable. + +Scheme has latent as opposed to manifest types. Types +are associated with values (also called objects) rather than +@cindex @w{object} +with variables. (Some authors refer to languages with latent types as +weakly typed or dynamically typed languages.) Other languages with +latent types are APL, Snobol, and other dialects of Lisp. Languages +with manifest types (sometimes referred to as strongly typed or +statically typed languages) include Algol 60, Pascal, and C. + +All objects created in the course of a Scheme computation, including +procedures and continuations, have unlimited extent. +No Scheme object is ever destroyed. The reason that +implementations of Scheme do not (usually!) run out of storage is that +they are permitted to reclaim the storage occupied by an object if +they can prove that the object cannot possibly matter to any future +computation. Other languages in which most objects have unlimited +extent include APL and other Lisp dialects. + +Implementations of Scheme are required to be properly tail-recursive. +This allows the execution of an iterative computation in constant space, +even if the iterative computation is described by a syntactically +recursive procedure. Thus with a properly tail-recursive implementation, +iteration can be expressed using the ordinary procedure-call +mechanics, so that special iteration constructs are useful only as +syntactic sugar. See section @ref{Proper tail recursion}. + +Scheme procedures are objects in their own right. Procedures can be +created dynamically, stored in data structures, returned as results of +procedures, and so on. Other languages with these properties include +Common Lisp and ML. +@ignore todo +Rozas: Scheme had them first. +@end ignore + + +One distinguishing feature of Scheme is that continuations, which +in most other languages only operate behind the scenes, also have +``first-class'' status. Continuations are useful for implementing a +wide variety of advanced control constructs, including non-local exits, +backtracking, and coroutines. See section @ref{Control features}. + +Arguments to Scheme procedures are always passed by value, which +means that the actual argument expressions are evaluated before the +procedure gains control, whether the procedure needs the result of the +evaluation or not. ML, C, and APL are three other languages that always +pass arguments by value. +This is distinct from the lazy-evaluation semantics of Haskell, +or the call-by-name semantics of Algol 60, where an argument +expression is not evaluated unless its value is needed by the +procedure. + +@ignore todo +Lisp's call by value should be explained more +accurately. What's funny is that all values are references. +@end ignore + + +Scheme's model of arithmetic is designed to remain as independent as +possible of the particular ways in which numbers are represented within a +computer. In Scheme, every integer is a rational number, every rational is a +real, and every real is a complex number. Thus the distinction between integer +and real arithmetic, so important to many programming languages, does not +appear in Scheme. In its place is a distinction between exact arithmetic, +which corresponds to the mathematical ideal, and inexact arithmetic on +approximations. As in Common Lisp, exact arithmetic is not limited to +integers. + +@node Syntax, Notation and terminology, Semantics, Overview of Scheme +@section Syntax + + +Scheme, like most dialects of Lisp, employs a fully parenthesized prefix +notation for programs and (other) data; the grammar of Scheme generates a +sublanguage of the language used for data. An important +consequence of this simple, uniform representation is the susceptibility of +Scheme programs and data to uniform treatment by other Scheme programs. +For example, the @samp{eval} procedure evaluates a Scheme program expressed +as data. + +The @samp{read} procedure performs syntactic as well as lexical decomposition of +the data it reads. The @samp{read} procedure parses its input as data +(section @pxref{External representation}), not as program. + +The formal syntax of Scheme is described in section @ref{Formal syntax}. + + +@node Notation and terminology, , Syntax, Overview of Scheme +@section Notation and terminology + +@menu +* Primitive; library; and optional features:: +* Error situations and unspecified behavior:: +* Entry format:: +* Evaluation examples:: +* Naming conventions:: +@end menu + + + +@node Primitive; library; and optional features, Error situations and unspecified behavior, Notation and terminology, Notation and terminology +@subsection Primitive; library; and optional features + + + +It is required that every implementation of Scheme support all +features that are not marked as being @dfn{optional}. Implementations are +@cindex @w{optional} +free to omit optional features of Scheme or to add extensions, +provided the extensions are not in conflict with the language reported +here. In particular, implementations must support portable code by +providing a syntactic mode that preempts no lexical conventions of this +report. + +To aid in understanding and implementing Scheme, some features are marked +as @dfn{library}. These can be easily implemented in terms of the other, +@cindex @w{library} +primitive, features. They are redundant in the strict sense of +the word, but they capture common patterns of usage, and are therefore +provided as convenient abbreviations. + +@node Error situations and unspecified behavior, Entry format, Primitive; library; and optional features, Notation and terminology +@subsection Error situations and unspecified behavior + + + +@cindex @w{error} +When speaking of an error situation, this report uses the phrase ``an +error is signalled'' to indicate that implementations must detect and +report the error. If such wording does not appear in the discussion of +an error, then implementations are not required to detect or report the +error, though they are encouraged to do so. An error situation that +implementations are not required to detect is usually referred to simply +as ``an error.'' + +For example, it is an error for a procedure to be passed an argument that +the procedure is not explicitly specified to handle, even though such +domain errors are seldom mentioned in this report. Implementations may +extend a procedure's domain of definition to include such arguments. + +This report uses the phrase ``may report a violation of an +implementation restriction'' to indicate circumstances under which an +implementation is permitted to report that it is unable to continue +execution of a correct program because of some restriction imposed by the +implementation. Implementation restrictions are of course discouraged, +but implementations are encouraged to report violations of implementation +restrictions. +@cindex @w{implementation restriction} + +For example, an implementation may report a violation of an +implementation restriction if it does not have enough storage to run a +program. + +If the value of an expression is said to be ``unspecified,'' then +the expression must evaluate to some object without signalling an error, +but the value depends on the implementation; this report explicitly does +not say what value should be returned. +@cindex @w{unspecified} + +@ignore todo +Talk about unspecified behavior vs. unspecified values. +@end ignore + + +@ignore todo +Look at KMP's situations paper. +@end ignore + + + +@node Entry format, Evaluation examples, Error situations and unspecified behavior, Notation and terminology +@subsection Entry format + + +Chapters @ref{Expressions} and @ref{Standard procedures} are organized +into entries. Each entry describes one language feature or a group of +related features, where a feature is either a syntactic construct or a +built-in procedure. An entry begins with one or more header lines of the form + + +@noindent +@deffn {@var{category}} @var{template} + +@end deffn + +for required, primitive features, or + + +@noindent +@deffn {@var{qualifier} @var{category}} @var{template} + +@end deffn + +where @var{qualifier} is either ``library'' or ``optional'' as defined + in section @ref{Primitive; library; and optional features}. + +If @var{category} is ``syntax'', the entry describes an expression +type, and the template gives the syntax of the expression type. +Components of expressions are designated by syntactic variables, which +are written using angle brackets, for example, @r{}, +@r{}. Syntactic variables should be understood to denote segments of +program text; for example, @r{} stands for any string of +characters which is a syntactically valid expression. The notation + +@format + @r{} @dots{} +@end format + +indicates zero or more occurrences of a @r{}, and + +@format + @r{} @r{} @dots{} +@end format + +indicates one or more occurrences of a @r{}. + +If @var{category} is ``procedure'', then the entry describes a procedure, and +the header line gives a template for a call to the procedure. Argument +names in the template are @var{italicized}. Thus the header line + + +@noindent +@deffn {procedure} vector-ref @var{vector} @var{k} + +@end deffn + +indicates that the built-in procedure @t{vector-ref} takes +two arguments, a vector @var{vector} and an exact non-negative integer +@var{k} (see below). The header lines + + +@noindent + +@deffn {procedure} make-vector @var{k} + + +@deffnx {procedure} make-vector @var{k} @var{fill} + +@end deffn + +indicate that the @t{make-vector} procedure must be defined to take +either one or two arguments. + + +It is an error for an operation to be presented with an argument that it +is not specified to handle. For succinctness, we follow the convention +that if an argument name is also the name of a type listed in +section @ref{Disjointness of types}, then that argument must be of the named type. +For example, the header line for @t{vector-ref} given above dictates that the +first argument to @t{vector-ref} must be a vector. The following naming +conventions also imply type restrictions: +@c \newcommand{\foo}[1]{\vr{#1}, \vri{#1}, $\ldots$ \vrj{#1}, $\ldots$} + + +@center @c begin-tabular +@quotation +@table @asis +@item @var{obj} +any object +@item @var{list}, @var{list1}, @dots{} @var{listj}, @dots{} +list (see section @pxref{Pairs and lists}) +@item @var{z}, @var{z1}, @dots{} @var{zj}, @dots{} +complex number +@item @var{x}, @var{x1}, @dots{} @var{xj}, @dots{} +real number +@item @var{y}, @var{y1}, @dots{} @var{yj}, @dots{} +real number +@item @var{q}, @var{q1}, @dots{} @var{qj}, @dots{} +rational number +@item @var{n}, @var{n1}, @dots{} @var{nj}, @dots{} +integer +@item @var{k}, @var{k1}, @dots{} @var{kj}, @dots{} +exact non-negative integer +@item +@end table +@end quotation + + + + +@ignore todo +Provide an example entry?? +@end ignore + + + +@node Evaluation examples, Naming conventions, Entry format, Notation and terminology +@subsection Evaluation examples + + +The symbol ``@result{}'' used in program examples should be read +``evaluates to.'' For example, + + +@example + +(* 5 8) ==> 40 + +@end example + + +means that the expression @t{(* 5 8)} evaluates to the object @t{40}. +Or, more precisely: the expression given by the sequence of characters +``@t{(* 5 8)}'' evaluates, in the initial environment, to an object +that may be represented externally by the sequence of characters ``@t{40}''. See section @ref{External representations} for a discussion of external +representations of objects. + +@node Naming conventions, , Evaluation examples, Notation and terminology +@subsection Naming conventions + + +By convention, the names of procedures that always return a boolean +value usually end +in ``@code{?}''. Such procedures are called predicates. +@vindex @w{?} + +By convention, the names of procedures that store values into previously +allocated locations (see section @pxref{Storage model}) usually end in +``@code{!}''. +@vindex @w{!} +Such procedures are called mutation procedures. +By convention, the value returned by a mutation procedure is unspecified. + +By convention, ``@code{->}'' appears within the names of procedures that +@vindex @w{->} +take an object of one type and return an analogous object of another type. +For example, @samp{list->vector} takes a list and returns a vector whose +elements are the same as those of the list. + + + +@ignore todo +Terms that need defining: thunk, command (what else?). +@end ignore + + +@c @include{lex} + +@c Lexical structure + +@c %\vfill\eject +@node Lexical conventions, Basic concepts, Overview of Scheme, top +@chapter Lexical conventions + +@menu +* Identifiers:: +* Whitespace and comments:: +* Other notations:: +@end menu + + +This section gives an informal account of some of the lexical +conventions used in writing Scheme programs. For a formal syntax of +Scheme, see section @ref{Formal syntax}. + +Upper and lower case forms of a letter are never distinguished +except within character and string constants. For example, @samp{Foo} is +the same identifier as @samp{FOO}, and @t{#x1AB} is the same number as +@t{#X1ab}. + +@node Identifiers, Whitespace and comments, Lexical conventions, Lexical conventions +@section Identifiers + + + +Most identifiers allowed by other programming +@cindex @w{identifier} +languages are also acceptable to Scheme. The precise rules for forming +identifiers vary among implementations of Scheme, but in all +implementations a sequence of letters, digits, and ``extended alphabetic +characters'' that begins with a character that cannot begin a number is +an identifier. In addition, @code{+}, @code{-}, and @code{...} are identifiers. +@vindex @w{...} +@vindex @w{-} +@vindex @w{+} +Here are some examples of identifiers: + + +@example + +lambda q +list->vector soup ++ V17a +<=? a34kTMNs +the-word-recursion-has-many-meanings + +@end example + + +Extended alphabetic characters may be used within identifiers as if +they were letters. The following are extended alphabetic characters: + + +@example + +! $ % & * + - . / : < = > ? @@ ^ _ ~ +@end example + + +See section @ref{Lexical structure} for a formal syntax of identifiers. + +Identifiers have two uses within Scheme programs: + + +@itemize @bullet + +@item +Any identifier may be used as a variable +or as a syntactic keyword +(see sections @pxref{Variables; syntactic keywords; and regions} and @pxref{Macros}). + +@item +When an identifier appears as a literal or within a literal +(see section @pxref{Literal expressions}), it is being used to denote a @emph{symbol} +(see section @pxref{Symbols}). + + +@end itemize + +@cindex @w{syntactic keyword} +@cindex @w{variable} + +@c \label{keywordsection} +@c The following identifiers are syntactic keywords, and should not be used +@c as variables: + +@c \begin{scheme} +@c => do or +@c and else quasiquote +@c begin if quote +@c case lambda set! +@c cond let unquote +@c define let* unquote-splicing +@c delay letrec% +@c \end{scheme} + +@c Some implementations allow all identifiers, including syntactic +@c keywords, to be used as variables. This is a compatible extension to +@c the language, but ambiguities in the language result when the +@c restriction is relaxed, and the ways in which these ambiguities are +@c resolved vary between implementations. + + +@node Whitespace and comments, Other notations, Identifiers, Lexical conventions +@section Whitespace and comments + + +@dfn{Whitespace} characters are spaces and newlines. +@cindex @w{Whitespace} +(Implementations typically provide additional whitespace characters such +as tab or page break.) Whitespace is used for improved readability and +as necessary to separate tokens from each other, a token being an +indivisible lexical unit such as an identifier or number, but is +otherwise insignificant. Whitespace may occur between any two tokens, +but not within a token. Whitespace may also occur inside a string, +where it is significant. + +A semicolon (@t{;}) indicates the start of a +comment. The comment continues to the +@cindex @w{;} +@cindex @w{comment} +end of the line on which the semicolon appears. Comments are invisible +to Scheme, but the end of the line is visible as whitespace. This +prevents a comment from appearing in the middle of an identifier or +number. + + +@example + +;;; The FACT procedure computes the factorial +;;; of a non-negative integer. +(define fact + (lambda (n) + (if (= n 0) + 1 ;Base case: return 1 + (* n (fact (- n 1)))))) + +@end example + + + +@node Other notations, , Whitespace and comments, Lexical conventions +@section Other notations + + +@ignore todo +Rewrite? +@end ignore + + +For a description of the notations used for numbers, see +section @ref{Numbers}. + + +@table @t + + +@item @t{.@: + -} +These are used in numbers, and may also occur anywhere in an identifier +except as the first character. A delimited plus or minus sign by itself +is also an identifier. +A delimited period (not occurring within a number or identifier) is used +in the notation for pairs (section @pxref{Pairs and lists}), and to indicate a +rest-parameter in a formal parameter list (section @pxref{Procedures}). +A delimited sequence of three successive periods is also an identifier. + +@item @t{( )} +Parentheses are used for grouping and to notate lists +(section @pxref{Pairs and lists}). + +@item @t{'} +The single quote character is used to indicate literal data (section @pxref{Literal expressions}). + +@item @t{`} +The backquote character is used to indicate almost-constant +data (section @pxref{Quasiquotation}). + +@item @t{, ,@@} +The character comma and the sequence comma at-sign are used in conjunction +with backquote (section @pxref{Quasiquotation}). + +@item @t{"} +The double quote character is used to delimit strings (section @pxref{Strings}). + +@item \ +Backslash is used in the syntax for character constants +(section @pxref{Characters}) and as an escape character within string +constants (section @pxref{Strings}). + +@c A box used because \verb is not allowed in command arguments. + +@item @w{@t{[ ] @{ @} |}} +Left and right square brackets and curly braces and vertical bar +are reserved for possible future extensions to the language. + +@item # + Sharp sign is used for a variety of purposes depending on +the character that immediately follows it: + +@item @t{#t} @t{#f} +These are the boolean constants (section @pxref{Booleans}). + +@item #\ +This introduces a character constant (section @pxref{Characters}). + +@item #@t{(} +This introduces a vector constant (section @pxref{Vectors}). Vector constants +are terminated by @t{)} . + +@item @t{#e #i #b #o #d #x} +These are used in the notation for numbers (section @pxref{Syntax of numerical constants}). + +@end table + + +@c @include{basic} + +@c \vfill\eject +@node Basic concepts, Expressions, Lexical conventions, top +@chapter Basic concepts + +@menu +* Variables; syntactic keywords; and regions:: +* Disjointness of types:: +* External representations:: +* Storage model:: +* Proper tail recursion:: +@end menu + + + +@node Variables; syntactic keywords; and regions, Disjointness of types, Basic concepts, Basic concepts +@section Variables; syntactic keywords; and regions + + + + +An identifier may name a type of syntax, or it may name +@cindex @w{identifier} +a location where a value can be stored. An identifier that names a type +of syntax is called a @emph{syntactic keyword} +@cindex @w{syntactic keyword} +and is said to be @emph{bound} to that syntax. An identifier that names a +location is called a @emph{variable} and is said to be +@cindex @w{variable} +@emph{bound} to that location. The set of all visible +bindings in effect at some point in a program is +@cindex @w{binding} +known as the @emph{environment} in effect at that point. The value +stored in the location to which a variable is bound is called the +variable's value. By abuse of terminology, the variable is sometimes +said to name the value or to be bound to the value. This is not quite +accurate, but confusion rarely results from this practice. + +@ignore todo +Define ``assigned'' and ``unassigned'' perhaps? +@end ignore + + +@ignore todo +In programs without side effects, one can safely pretend that the +variables are bound directly to the arguments. Or: +In programs without @code{set!}, one can safely pretend that the +@vindex @w{set!} +variable is bound directly to the value. +@end ignore + + +Certain expression types are used to create new kinds of syntax +and bind syntactic keywords to those new syntaxes, while other +expression types create new locations and bind variables to those +locations. These expression types are called @emph{binding constructs}. + +@cindex @w{binding construct} +Those that bind syntactic keywords are listed in section @ref{Macros}. +The most fundamental of the variable binding constructs is the +@samp{lambda} expression, because all other variable binding constructs +can be explained in terms of @samp{lambda} expressions. The other +variable binding constructs are @samp{let}, @samp{let*}, @samp{letrec}, +and @samp{do} expressions (see sections @pxref{Procedures}, @pxref{Binding constructs}, and +@pxref{Iteration}). + +@c Note: internal definitions not mentioned here. + +Like Algol and Pascal, and unlike most other dialects of Lisp +except for Common Lisp, Scheme is a statically scoped language with +block structure. To each place where an identifier is bound in a program +there corresponds a @dfn{region} of the program text within which +@cindex @w{region} +the binding is visible. The region is determined by the particular +binding construct that establishes the binding; if the binding is +established by a @samp{lambda} expression, for example, then its region +is the entire @samp{lambda} expression. Every mention of an identifier +refers to the binding of the identifier that established the +innermost of the regions containing the use. If there is no binding of +the identifier whose region contains the use, then the use refers to the +binding for the variable in the top level environment, if any +(chapters @pxref{Expressions} and @pxref{Standard procedures}); if there is no +binding for the identifier, +it is said to be @dfn{unbound}. +@cindex @w{top level environment} +@cindex @w{bound} +@cindex @w{unbound} + +@ignore todo +Mention that some implementations have multiple top level environments? +@end ignore + + +@ignore todo +Pitman sez: needs elaboration in case of @t{(let ...)} +@end ignore + + +@ignore todo +Pitman asks: say something about vars created after scheme starts? +@t{(define x 3) (define (f) x) (define (g) y) (define y 4)} +Clinger replies: The language was explicitly +designed to permit a view in which no variables are created after +Scheme starts. In files, you can scan out the definitions beforehand. +I think we're agreed on the principle that interactive use should +approximate that behavior as closely as possible, though we don't yet +agree on which programming environment provides the best approximation. +@end ignore + + +@node Disjointness of types, External representations, Variables; syntactic keywords; and regions, Basic concepts +@section Disjointness of types + + + +No object satisfies more than one of the following predicates: + + +@example + +boolean? pair? +symbol? number? +char? string? +vector? port? +procedure? + +@end example + + +These predicates define the types @emph{boolean}, @emph{pair}, @emph{symbol}, @emph{number}, @emph{char} (or @emph{character}), @emph{string}, @emph{vector}, @emph{port}, and @emph{procedure}. The empty list is a special +object of its own type; it satisfies none of the above predicates. + +@vindex symbol? +@vindex pair? +@vindex boolean? +@cindex @w{type} + +@vindex vector? +@vindex string? +@vindex char? +@vindex number? + +@cindex @w{empty list} +@vindex procedure? +@vindex port? + +Although there is a separate boolean type, +any Scheme value can be used as a boolean value for the purpose of a +conditional test. As explained in section @ref{Booleans}, all +values count as true in such a test except for @t{#f}. +@c and possibly the empty list. +@c The only value that is guaranteed to count as +@c false is \schfalse{}. It is explicitly unspecified whether the empty list +@c counts as true or as false. +This report uses the word ``true'' to refer to any +Scheme value except @t{#f}, and the word ``false'' to refer to +@t{#f}. +@cindex @w{false} +@cindex @w{true} + +@node External representations, Storage model, Disjointness of types, Basic concepts +@section External representations + + + +An important concept in Scheme (and Lisp) is that of the @emph{external +representation} of an object as a sequence of characters. For example, +an external representation of the integer 28 is the sequence of +characters ``@t{28}'', and an external representation of a list consisting +of the integers 8 and 13 is the sequence of characters ``@t{(8 13)}''. + +The external representation of an object is not necessarily unique. The +integer 28 also has representations ``@t{#e28.000}'' and ``@t{#x1c}'', and the +list in the previous paragraph also has the representations ``@t{( 08 13 +)}'' and ``@t{(8 .@: (13 .@: ()))}'' (see section @pxref{Pairs and lists}). + +Many objects have standard external representations, but some, such as +procedures, do not have standard representations (although particular +implementations may define representations for them). + +An external representation may be written in a program to obtain the +corresponding object (see @samp{quote}, section @pxref{Literal expressions}). + +External representations can also be used for input and output. The +procedure @samp{read} (section @pxref{Input}) parses external +representations, and the procedure @samp{write} (section @pxref{Output}) +generates them. Together, they provide an elegant and powerful +input/output facility. + +Note that the sequence of characters ``@t{(+ 2 6)}'' is @emph{not} an +external representation of the integer 8, even though it @emph{is} an +expression evaluating to the integer 8; rather, it is an external +representation of a three-element list, the elements of which are the symbol +@t{+} and the integers 2 and 6. Scheme's syntax has the property that +any sequence of characters that is an expression is also the external +representation of some object. This can lead to confusion, since it may +not be obvious out of context whether a given sequence of characters is +intended to denote data or program, but it is also a source of power, +since it facilitates writing programs such as interpreters and +compilers that treat programs as data (or vice versa). + +The syntax of external representations of various kinds of objects +accompanies the description of the primitives for manipulating the +objects in the appropriate sections of chapter @ref{Standard procedures}. + +@node Storage model, Proper tail recursion, External representations, Basic concepts +@section Storage model + + + +Variables and objects such as pairs, vectors, and strings implicitly +denote locations or sequences of locations. A string, for +@cindex @w{location} +example, denotes as many locations as there are characters in the string. +(These locations need not correspond to a full machine word.) A new value may be +stored into one of these locations using the @t{string-set!} procedure, but +the string continues to denote the same locations as before. + +An object fetched from a location, by a variable reference or by +a procedure such as @samp{car}, @samp{vector-ref}, or @samp{string-ref}, is +equivalent in the sense of @code{eqv?} +@c and \ide{eq?} ?? +(section @pxref{Equivalence predicates}) +@vindex @w{eqv?} +to the object last stored in the location before the fetch. + +Every location is marked to show whether it is in use. +No variable or object ever refers to a location that is not in use. +Whenever this report speaks of storage being allocated for a variable +or object, what is meant is that an appropriate number of locations are +chosen from the set of locations that are not in use, and the chosen +locations are marked to indicate that they are now in use before the variable +or object is made to denote them. + +In many systems it is desirable for constants (i.e. the values of +@cindex @w{constant} +literal expressions) to reside in read-only-memory. To express this, it is +convenient to imagine that every object that denotes locations is associated +with a flag telling whether that object is mutable or +@cindex @w{mutable} +immutable. In such systems literal constants and the strings +@cindex @w{immutable} +returned by @code{symbol->string} are immutable objects, while all objects +@vindex @w{symbol->string} +created by the other procedures listed in this report are mutable. It is an +error to attempt to store a new value into a location that is denoted by an +immutable object. + +@node Proper tail recursion, , Storage model, Basic concepts +@section Proper tail recursion + + + +Implementations of Scheme are required to be +@emph{properly tail-recursive}. +@cindex @w{proper tail recursion} +Procedure calls that occur in certain syntactic +contexts defined below are `tail calls'. A Scheme implementation is +properly tail-recursive if it supports an unbounded number of active +tail calls. A call is @emph{active} if the called procedure may still +return. Note that this includes calls that may be returned from either +by the current continuation or by continuations captured earlier by +@samp{call-with-current-continuation} that are later invoked. +In the absence of captured continuations, calls could +return at most once and the active calls would be those that had not +yet returned. +A formal definition of proper tail recursion can be found +in [propertailrecursion]. + + +@quotation +@emph{Rationale:} + +Intuitively, no space is needed for an active tail call because the +continuation that is used in the tail call has the same semantics as the +continuation passed to the procedure containing the call. Although an improper +implementation might use a new continuation in the call, a return +to this new continuation would be followed immediately by a return +to the continuation passed to the procedure. A properly tail-recursive +implementation returns to that continuation directly. + +Proper tail recursion was one of the central ideas in Steele and +Sussman's original version of Scheme. Their first Scheme interpreter +implemented both functions and actors. Control flow was expressed using +actors, which differed from functions in that they passed their results +on to another actor instead of returning to a caller. In the terminology +of this section, each actor finished with a tail call to another actor. + +Steele and Sussman later observed that in their interpreter the code +for dealing with actors was identical to that for functions and thus +there was no need to include both in the language. + +@end quotation + + +A @emph{tail call} is a procedure call that occurs +@cindex @w{tail call} +in a @emph{tail context}. Tail contexts are defined inductively. Note +that a tail context is always determined with respect to a particular lambda +expression. + + + +@itemize @bullet + +@item +The last expression within the body of a lambda expression, +shown as @r{} below, occurs in a tail context. + +@format +@t{(lambda + * * ) +} + +@end format + + + +@item +If one of the following expressions is in a tail context, +then the subexpressions shown as are in a tail context. +These were derived from rules in the grammar given in +chapter @ref{Formal syntax and semantics} by replacing some occurrences of +with . Only those rules that contain tail contexts +are shown here. + + +@format +@t{(if ) +(if ) + +(cond +) +(cond * (else )) + +(case + +) +(case + * + (else )) + +(and * ) +(or * ) + +(let (*) ) +(let (*) ) +(let* (*) ) +(letrec (*) ) + +(let-syntax (*) ) +(letrec-syntax (*) ) + +(begin ) + +(do (*) + ( ) + *) + +@r{where} + + --> ( ) + --> ((*) ) + + --> * + --> * +} + +@end format + + + +@item +If a @samp{cond} expression is in a tail context, and has a clause of +the form @samp{(@r{} => @r{})} +then the (implied) call to +the procedure that results from the evaluation of @r{} is in a +tail context. @r{} itself is not in a tail context. + + +@end itemize + + +Certain built-in procedures are also required to perform tail calls. +The first argument passed to @code{apply} and to +@vindex @w{apply} +@code{call-with-current-continuation}, and the second argument passed to +@vindex @w{call-with-current-continuation} +@code{call-with-values}, must be called via a tail call. +@vindex @w{call-with-values} +Similarly, @code{eval} must evaluate its argument as if it +@vindex @w{eval} +were in tail position within the @code{eval} procedure. +@vindex @w{eval} + +In the following example the only tail call is the call to @samp{f}. +None of the calls to @samp{g} or @samp{h} are tail calls. The reference to +@samp{x} is in a tail context, but it is not a call and thus is not a +tail call. + +@example + +(lambda () + (if (g) + (let ((x (h))) + x) + (and (g) (f)))) + +@end example + + + +@quotation +@emph{Note:} +Implementations are allowed, but not required, to +recognize that some non-tail calls, such as the call to @samp{h} +above, can be evaluated as though they were tail calls. +In the example above, the @samp{let} expression could be compiled +as a tail call to @samp{h}. (The possibility of @samp{h} returning +an unexpected number of values can be ignored, because in that +case the effect of the @samp{let} is explicitly unspecified and +implementation-dependent.) +@end quotation + + + +@c @include{expr} + +@c \vfill\eject +@node Expressions, Program structure, Basic concepts, top +@chapter Expressions + +@menu +* Primitive expression types:: +* Derived expression types:: +* Macros:: +@end menu + + + +@c \newcommand{\syntax}{{\em Syntax: }} +@c \newcommand{\semantics}{{\em Semantics: }} + +@c [Deleted for R5RS because of multiple-value returns. -RK] +@c A Scheme expression is a construct that returns a value, such as a +@c variable reference, literal, procedure call, or conditional. + +Expression types are categorized as @emph{primitive} or @emph{derived}. +Primitive expression types include variables and procedure calls. +Derived expression types are not semantically primitive, but can instead +be defined as macros. +With the exception of @samp{quasiquote}, whose macro definition is complex, +the derived expressions are classified as library features. +Suitable definitions are given in section @ref{Derived expression type}. + +@node Primitive expression types, Derived expression types, Expressions, Expressions +@section Primitive expression types + +@menu +* Variable references:: +* Literal expressions:: +* Procedure calls:: +* Procedures:: +* Conditionals:: +* Assignments:: +@end menu + + + +@node Variable references, Literal expressions, Primitive expression types, Primitive expression types +@subsection Variable references + + + +@deffn {syntax} @r{} + + +An expression consisting of a variable +@cindex @w{variable} +(section @pxref{Variables; syntactic keywords; and regions}) is a variable reference. The value of +the variable reference is the value stored in the location to which the +variable is bound. It is an error to reference an +unbound variable. +@cindex @w{unbound} + + +@format +@t{(define x 28) +x ==> 28 +} +@end format + +@end deffn + +@node Literal expressions, Procedure calls, Variable references, Primitive expression types +@subsection Literal expressions + + + + +@deffn {syntax} quote @r{} + +@deffnx {syntax} @t{'}@r{} + + +@deffnx {syntax} @r{} + + +@samp{(quote @r{})} evaluates to @r{}. +@cindex @w{'} +@r{} +may be any external representation of a Scheme object (see +section @pxref{External representations}). This notation is used to include literal +constants in Scheme code. + + +@format +@t{ +(quote a) ==> a +(quote #(a b c)) ==> #(a b c) +(quote (+ 1 2)) ==> (+ 1 2) +} +@end format + + +@samp{(quote @r{})} may be abbreviated as +@t{'}@r{}. The two notations are equivalent in all +respects. + + +@format +@t{'a ==> a +'#(a b c) ==> #(a b c) +'() ==> () +'(+ 1 2) ==> (+ 1 2) +'(quote a) ==> (quote a) +''a ==> (quote a) +} +@end format + + +Numerical constants, string constants, character constants, and boolean +constants evaluate ``to themselves''; they need not be quoted. + + +@format +@t{'"abc" ==> "abc" +"abc" ==> "abc" +'145932 ==> 145932 +145932 ==> 145932 +'#t ==> #t +#t ==> #t +} +@end format + + +As noted in section @ref{Storage model}, it is an error to alter a constant +(i.e. the value of a literal expression) using a mutation procedure like +@samp{set-car!} or @samp{string-set!}. + +@end deffn + + +@node Procedure calls, Procedures, Literal expressions, Primitive expression types +@subsection Procedure calls + + + +@deffn {syntax} @r{} @r{} @dots{}, + + +A procedure call is written by simply enclosing in parentheses +expressions for the procedure to be called and the arguments to be +passed to it. The operator and operand expressions are evaluated (in an +unspecified order) and the resulting procedure is passed the resulting +arguments. +@cindex @w{procedure call} +@cindex @w{call} + +@format +@t{ +(+ 3 4) ==> 7 +((if #f + *) 3 4) ==> 12 +} +@end format + + +A number of procedures are available as the values of variables in the +initial environment; for example, the addition and multiplication +procedures in the above examples are the values of the variables @samp{+} +and @samp{*}. New procedures are created by evaluating lambda expressions +(see section @pxref{Procedures}). +@ignore todo +At Friedman's request, flushed mention of other ways. +@end ignore + +@c or definitions (see section~\ref{define}). + +Procedure calls may return any number of values (see @code{values} in +@vindex @w{values} +section @pxref{Control features}). With the exception of @samp{values} +the procedures available in the initial environment return one +value or, for procedures such as @samp{apply}, pass on the values returned +by a call to one of their arguments. + +Procedure calls are also called @emph{combinations}. + +@cindex @w{combination} + + +@quotation +@emph{Note:} In contrast to other dialects of Lisp, the order of +evaluation is unspecified, and the operator expression and the operand +expressions are always evaluated with the same evaluation rules. +@end quotation + + + +@quotation +@emph{Note:} +Although the order of evaluation is otherwise unspecified, the effect of +any concurrent evaluation of the operator and operand expressions is +constrained to be consistent with some sequential order of evaluation. +The order of evaluation may be chosen differently for each procedure call. +@end quotation + + + +@quotation +@emph{Note:} In many dialects of Lisp, the empty combination, @t{()}, is a legitimate expression. In Scheme, combinations must have at +least one subexpression, so @t{()} is not a syntactically valid +expression. +@ignore todo +Dybvig: ``it should be obvious from the syntax.'' +@end ignore + +@end quotation + + +@ignore todo +Freeman: +I think an explanation as to why evaluation order is not specified +should be included. It should not include any reference to parallel +evaluation. Does any existing compiler generate better code because +the evaluation order is unspecified? Clinger: yes: T3, MacScheme v2, +probably MIT Scheme and Chez Scheme. But that's not the main reason +for leaving the order unspecified. +@end ignore + + +@end deffn + + +@node Procedures, Conditionals, Procedure calls, Primitive expression types +@subsection Procedures + + + + +@deffn {syntax} lambda @r{} @r{} + +@emph{Syntax:} +@r{} should be a formal arguments list as described below, +and @r{} should be a sequence of one or more expressions. + +@emph{Semantics:} +A lambda expression evaluates to a procedure. The environment in +effect when the lambda expression was evaluated is remembered as part of the +procedure. When the procedure is later called with some actual +arguments, the environment in which the lambda expression was evaluated will +be extended by binding the variables in the formal argument list to +fresh locations, the corresponding actual argument values will be stored +in those locations, and the expressions in the body of the lambda expression +will be evaluated sequentially in the extended environment. +The result(s) of the last expression in the body will be returned as +the result(s) of the procedure call. + + +@format +@t{(lambda (x) (+ x x)) ==> @emph{}a procedure +((lambda (x) (+ x x)) 4) ==> 8 + +(define reverse-subtract + (lambda (x y) (- y x))) +(reverse-subtract 7 10) ==> 3 + +(define add4 + (let ((x 4)) + (lambda (y) (+ x y)))) +(add4 6) ==> 10 +} +@end format + + +@r{} should have one of the following forms: + + + +@itemize @bullet + +@item +@t{(@r{} @dots{},)}: +The procedure takes a fixed number of arguments; when the procedure is +called, the arguments will be stored in the bindings of the +corresponding variables. + +@item +@r{}: +The procedure takes any number of arguments; when the procedure is +called, the sequence of actual arguments is converted into a newly +allocated list, and the list is stored in the binding of the +@r{}. + +@item +@t{(@r{} @dots{}, @r{} @b{.} +@r{})}: +If a space-delimited period precedes the last variable, then +the procedure takes n or more arguments, where n is the +number of formal arguments before the period (there must +be at least one). +The value stored in the binding of the last variable will be a +newly allocated +list of the actual arguments left over after all the other actual +arguments have been matched up against the other formal arguments. + +@end itemize + + +It is an error for a @r{} to appear more than once in +@r{}. + + +@format +@t{((lambda x x) 3 4 5 6) ==> (3 4 5 6) +((lambda (x y . z) z) + 3 4 5 6) ==> (5 6) +} +@end format + + +Each procedure created as the result of evaluating a lambda expression is +(conceptually) tagged +with a storage location, in order to make @code{eqv?} and +@vindex @w{eqv?} +@code{eq?} work on procedures (see section @pxref{Equivalence predicates}). +@vindex @w{eq?} + +@end deffn + + +@node Conditionals, Assignments, Procedures, Primitive expression types +@subsection Conditionals + + + +@deffn {syntax} if @r{} @r{} @r{} +@deffnx {syntax} if @r{} @r{} +@c \/ if hyper = italic + +@emph{Syntax:} +@r{}, @r{}, and @r{} may be arbitrary +expressions. + +@emph{Semantics:} +An @samp{if} expression is evaluated as follows: first, +@r{} is evaluated. If it yields a true value (see +@cindex @w{true} +section @pxref{Booleans}), then @r{} is evaluated and +its value(s) is(are) returned. Otherwise @r{} is evaluated and its +value(s) is(are) returned. If @r{} yields a false value and no +@r{} is specified, then the result of the expression is +unspecified. + + +@format +@t{(if (> 3 2) 'yes 'no) ==> yes +(if (> 2 3) 'yes 'no) ==> no +(if (> 3 2) + (- 3 2) + (+ 3 2)) ==> 1 +} +@end format + + +@end deffn + + +@node Assignments, , Conditionals, Primitive expression types +@subsection Assignments + + + + +@deffn {syntax} set! @r{} @r{} + +@r{} is evaluated, and the resulting value is stored in +the location to which @r{} is bound. @r{} must +be bound either in some region enclosing the @samp{set!} expression +@cindex @w{region} +or at top level. The result of the @samp{set!} expression is +unspecified. + + +@format +@t{(define x 2) +(+ x 1) ==> 3 +(set! x 4) ==> @emph{unspecified} +(+ x 1) ==> 5 +} +@end format + + +@end deffn + + +@node Derived expression types, Macros, Primitive expression types, Expressions +@section Derived expression types + +@menu +* Conditional:: +* Binding constructs:: +* Sequencing:: +* Iteration:: +* Delayed evaluation:: +* Quasiquotation:: +@end menu + + + +The constructs in this section are hygienic, as discussed in +section @ref{Macros}. +For reference purposes, section @ref{Derived expression type} gives macro definitions +that will convert most of the constructs described in this section +into the primitive constructs described in the previous section. + +@ignore todo +Mention that no definition of backquote is provided? +@end ignore + + +@node Conditional, Binding constructs, Derived expression types, Derived expression types +@subsection Conditionals + + + +@deffn {library syntax} cond @dots{}, + +@emph{Syntax:} +Each @r{} should be of the form + +@format +@t{(@r{} @r{} @dots{},) +} +@end format + +where @r{} is any expression. Alternatively, a @r{} may be +of the form + +@format +@t{(@r{} => @r{}) +} +@end format + +The last @r{} may be +an ``else clause,'' which has the form + +@format +@t{(else @r{} @r{} @dots{},)@r{.} +} +@end format + + +@cindex @w{else} + +@cindex @w{=>} + +@emph{Semantics:} +A @samp{cond} expression is evaluated by evaluating the @r{} +expressions of successive @r{}s in order until one of them +evaluates to a true value (see +@cindex @w{true} +section @pxref{Booleans}). When a @r{} evaluates to a true +value, then the remaining @r{}s in its @r{} are +evaluated in order, and the result(s) of the last @r{} in the +@r{} is(are) returned as the result(s) of the entire @samp{cond} +expression. If the selected @r{} contains only the +@r{} and no @r{}s, then the value of the +@r{} is returned as the result. If the selected @r{} uses the +@code{=>} alternate form, then the @r{} is evaluated. +@vindex @w{=>} +Its value must be a procedure that accepts one argument; this procedure is then +called on the value of the @r{} and the value(s) returned by this +procedure is(are) returned by the @samp{cond} expression. +If all @r{}s evaluate +to false values, and there is no else clause, then the result of +the conditional expression is unspecified; if there is an else +clause, then its @r{}s are evaluated, and the value(s) of +the last one is(are) returned. + + +@format +@t{(cond ((> 3 2) 'greater) + ((< 3 2) 'less)) ==> greater + +(cond ((> 3 3) 'greater) + ((< 3 3) 'less) + (else 'equal)) ==> equal + +(cond ((assv 'b '((a 1) (b 2))) => cadr) + (else #f)) ==> 2 +} +@end format + + + +@end deffn + + + +@deffn {library syntax} case @r{} @dots{}, + +@emph{Syntax:} +@r{} may be any expression. Each @r{} should have +the form + +@format +@t{((@r{} @dots{},) @r{} @r{} @dots{},)@r{,} +} +@end format + +where each @r{} is an external representation of some object. +All the @r{}s must be distinct. +The last @r{} may be an ``else clause,'' which has the form + +@format +@t{(else @r{} @r{} @dots{},)@r{.} +} +@end format + + +@vindex else + +@emph{Semantics:} +A @samp{case} expression is evaluated as follows. @r{} is +evaluated and its result is compared against each @r{}. If the +result of evaluating @r{} is equivalent (in the sense of +@samp{eqv?}; see section @pxref{Equivalence predicates}) to a @r{}, then the +expressions in the corresponding @r{} are evaluated from left +to right and the result(s) of the last expression in the @r{} is(are) +returned as the result(s) of the @samp{case} expression. If the result of +evaluating @r{} is different from every @r{}, then if +there is an else clause its expressions are evaluated and the +result(s) of the last is(are) the result(s) of the @samp{case} expression; +otherwise the result of the @samp{case} expression is unspecified. + + +@format +@t{(case (* 2 3) + ((2 3 5 7) 'prime) + ((1 4 6 8 9) 'composite)) ==> composite +(case (car '(c d)) + ((a) 'a) + ((b) 'b)) ==> @emph{unspecified} +(case (car '(c d)) + ((a e i o u) 'vowel) + ((w y) 'semivowel) + (else 'consonant)) ==> consonant +} +@end format + + +@end deffn + + + +@deffn {library syntax} and @dots{}, + +The @r{} expressions are evaluated from left to right, and the +value of the first expression that evaluates to a false value (see +section @pxref{Booleans}) is returned. Any remaining expressions +are not evaluated. If all the expressions evaluate to true values, the +value of the last expression is returned. If there are no expressions +then @t{#t} is returned. + + +@format +@t{(and (= 2 2) (> 2 1)) ==> #t +(and (= 2 2) (< 2 1)) ==> #f +(and 1 2 'c '(f g)) ==> (f g) +(and) ==> #t +} +@end format + + +@end deffn + + + +@deffn {library syntax} or @dots{}, + +The @r{} expressions are evaluated from left to right, and the value of the +first expression that evaluates to a true value (see +section @pxref{Booleans}) is returned. Any remaining expressions +are not evaluated. If all expressions evaluate to false values, the +value of the last expression is returned. If there are no +expressions then @t{#f} is returned. + + +@format +@t{(or (= 2 2) (> 2 1)) ==> #t +(or (= 2 2) (< 2 1)) ==> #t +(or #f #f #f) ==> #f +(or (memq 'b '(a b c)) + (/ 3 0)) ==> (b c) +} +@end format + + +@end deffn + + +@node Binding constructs, Sequencing, Conditional, Derived expression types +@subsection Binding constructs + + +The three binding constructs @samp{let}, @samp{let*}, and @samp{letrec} +give Scheme a block structure, like Algol 60. The syntax of the three +constructs is identical, but they differ in the regions they establish +@cindex @w{region} +for their variable bindings. In a @samp{let} expression, the initial +values are computed before any of the variables become bound; in a +@samp{let*} expression, the bindings and evaluations are performed +sequentially; while in a @samp{letrec} expression, all the bindings are in +effect while their initial values are being computed, thus allowing +mutually recursive definitions. + + +@deffn {library syntax} let @r{} @r{} + +@emph{Syntax:} +@r{} should have the form + +@format +@t{((@r{} @r{}) @dots{},)@r{,} +} +@end format + +where each @r{} is an expression, and @r{} should be a +sequence of one or more expressions. It is +an error for a @r{} to appear more than once in the list of variables +being bound. + +@emph{Semantics:} +The @r{}s are evaluated in the current environment (in some +unspecified order), the @r{}s are bound to fresh locations +holding the results, the @r{} is evaluated in the extended +environment, and the value(s) of the last expression of @r{} +is(are) returned. Each binding of a @r{} has @r{} as its +region. +@cindex @w{region} + + +@format +@t{(let ((x 2) (y 3)) + (* x y)) ==> 6 + +(let ((x 2) (y 3)) + (let ((x 7) + (z (+ x y))) + (* z x))) ==> 35 +} +@end format + + +See also named @samp{let}, section @ref{Iteration}. + +@end deffn + + + +@deffn {library syntax} let* @r{} @r{} + + +@emph{Syntax:} +@r{} should have the form + +@format +@t{((@r{} @r{}) @dots{},)@r{,} +} +@end format + +and @r{} should be a sequence of +one or more expressions. + +@emph{Semantics:} +@samp{Let*} is similar to @samp{let}, but the bindings are performed +sequentially from left to right, and the region of a binding indicated +@cindex @w{region} +by @samp{(@r{} @r{})} is that part of the @samp{let*} +expression to the right of the binding. Thus the second binding is done +in an environment in which the first binding is visible, and so on. + + +@format +@t{(let ((x 2) (y 3)) + (let* ((x 7) + (z (+ x y))) + (* z x))) ==> 70 +} +@end format + + +@end deffn + + + +@deffn {library syntax} letrec @r{} @r{} + +@emph{Syntax:} +@r{} should have the form + +@format +@t{((@r{} @r{}) @dots{},)@r{,} +} +@end format + +and @r{} should be a sequence of +one or more expressions. It is an error for a @r{} to appear more +than once in the list of variables being bound. + +@emph{Semantics:} +The @r{}s are bound to fresh locations holding undefined +values, the @r{}s are evaluated in the resulting environment (in +some unspecified order), each @r{} is assigned to the result +of the corresponding @r{}, the @r{} is evaluated in the +resulting environment, and the value(s) of the last expression in +@r{} is(are) returned. Each binding of a @r{} has the +entire @samp{letrec} expression as its region, making it possible to +@cindex @w{region} +define mutually recursive procedures. + + +@format +@t{(letrec ((even? + (lambda (n) + (if (zero? n) + #t + (odd? (- n 1))))) + (odd? + (lambda (n) + (if (zero? n) + #f + (even? (- n 1)))))) + (even? 88)) + ==> #t +} +@end format + + +One restriction on @samp{letrec} is very important: it must be possible +to evaluate each @r{} without assigning or referring to the value of any +@r{}. If this restriction is violated, then it is an error. The +restriction is necessary because Scheme passes arguments by value rather than by +name. In the most common uses of @samp{letrec}, all the @r{}s are +lambda expressions and the restriction is satisfied automatically. + +@c \todo{use or uses? --- Jinx.} + +@end deffn + + +@node Sequencing, Iteration, Binding constructs, Derived expression types +@subsection Sequencing + + + +@deffn {library syntax} begin @dots{}, + +The @r{}s are evaluated sequentially from left to right, +and the value(s) of the last @r{} is(are) returned. This +expression type is used to sequence side effects such as input and +output. + + +@format +@t{(define x 0) + +(begin (set! x 5) + (+ x 1)) ==> 6 + +(begin (display "4 plus 1 equals ") + (display (+ 4 1))) ==> @emph{unspecified} + @emph{and prints} 4 plus 1 equals 5 +} +@end format + + +@end deffn + + +@node Iteration, Delayed evaluation, Sequencing, Derived expression types +@subsection Iteration + +@c \unsection + + +@noindent + +@deffn {library syntax} do ((@r{} @r{} @r{}) @dots{}) (@r{} @r{} @dots{}) @r{} @dots{} +@cindex @w{do} + +@samp{Do} is an iteration construct. It specifies a set of variables to +be bound, how they are to be initialized at the start, and how they are +to be updated on each iteration. When a termination condition is met, +the loop exits after evaluating the @r{}s. + +@samp{Do} expressions are evaluated as follows: +The @r{} expressions are evaluated (in some unspecified order), +the @r{}s are bound to fresh locations, the results of the +@r{} expressions are stored in the bindings of the +@r{}s, and then the iteration phase begins. + +Each iteration begins by evaluating @r{}; if the result is +false (see section @pxref{Booleans}), then the @r{} +expressions are evaluated in order for effect, the @r{} +expressions are evaluated in some unspecified order, the +@r{}s are bound to fresh locations, the results of the +@r{}s are stored in the bindings of the +@r{}s, and the next iteration begins. + +If @r{} evaluates to a true value, then the +@r{}s are evaluated from left to right and the value(s) of +the last @r{} is(are) returned. If no @r{}s +are present, then the value of the @samp{do} expression is unspecified. + +The region of the binding of a @r{} +@cindex @w{region} +consists of the entire @samp{do} expression except for the @r{}s. +It is an error for a @r{} to appear more than once in the +list of @samp{do} variables. + +A @r{} may be omitted, in which case the effect is the +same as if @samp{(@r{} @r{} @r{})} had +been written instead of @samp{(@r{} @r{})}. + + +@format +@t{(do ((vec (make-vector 5)) + (i 0 (+ i 1))) + ((= i 5) vec) + (vector-set! vec i i)) ==> #(0 1 2 3 4) + +(let ((x '(1 3 5 7 9))) + (do ((x x (cdr x)) + (sum 0 (+ sum (car x)))) + ((null? x) sum))) ==> 25 +} +@end format + + +@c \end{entry} +@end deffn + + +@deffn {library syntax} let @r{} @r{} @r{} + + +``Named @samp{let}'' is a variant on the syntax of @code{let} which provides +@vindex @w{let} +a more general looping construct than @samp{do} and may also be used to express +recursions. +It has the same syntax and semantics as ordinary @samp{let} +except that @r{} is bound within @r{} to a procedure +whose formal arguments are the bound variables and whose body is +@r{}. Thus the execution of @r{} may be repeated by +invoking the procedure named by @r{}. + +@c | <-- right margin + +@format +@t{(let loop ((numbers '(3 -2 1 6 -5)) + (nonneg '()) + (neg '())) + (cond ((null? numbers) (list nonneg neg)) + ((>= (car numbers) 0) + (loop (cdr numbers) + (cons (car numbers) nonneg) + neg)) + ((< (car numbers) 0) + (loop (cdr numbers) + nonneg + (cons (car numbers) neg))))) + ==> ((6 1 3) (-5 -2)) +} +@end format + + +@end deffn + + +@node Delayed evaluation, Quasiquotation, Iteration, Derived expression types +@subsection Delayed evaluation + + + +@deffn {library syntax} delay @r{} + +@ignore todo +Fix. +@end ignore + + +The @samp{delay} construct is used together with the procedure @code{force} to +@vindex @w{force} +implement @dfn{lazy evaluation} or @dfn{call by need}. +@cindex @w{call by need} +@cindex @w{lazy evaluation} +@t{(delay @r{})} returns an object called a +@dfn{promise} which at some point in the future may be asked (by +@cindex @w{promise} +the @samp{force} procedure) +@ignore todo +Bartley's white lie; OK? +@end ignore + to evaluate +@r{}, and deliver the resulting value. +The effect of @r{} returning multiple values +is unspecified. + +See the description of @samp{force} (section @pxref{Control features}) for a +more complete description of @samp{delay}. + +@end deffn + + +@node Quasiquotation, , Delayed evaluation, Derived expression types +@subsection Quasiquotation + + + + +@deffn {syntax} quasiquote @r{} + +@deffnx {syntax} @t{`}@r{} + + +``Backquote'' or ``quasiquote'' expressions are useful +@cindex @w{backquote} +for constructing a list or vector structure when most but not all of the +desired structure is known in advance. If no +commas appear within the @r{}, the result of +@cindex @w{comma} +evaluating +@t{`}@r{} is equivalent to the result of evaluating +@t{'}@r{}. If a comma appears within the +@cindex @w{,} +@r{}, however, the expression following the comma is +evaluated (``unquoted'') and its result is inserted into the structure +instead of the comma and the expression. If a comma appears followed +immediately by an at-sign (@@), then the following +@cindex @w{,@@} +expression must evaluate to a list; the opening and closing parentheses +of the list are then ``stripped away'' and the elements of the list are +inserted in place of the comma at-sign expression sequence. A comma +at-sign should only appear within a list or vector @r{}. + +@c struck: "(in the sense of {\cf equal?})" after "equivalent" + + +@format +@t{`(list ,(+ 1 2) 4) ==> (list 3 4) +(let ((name 'a)) `(list ,name ',name)) + ==> (list a (quote a)) +`(a ,(+ 1 2) ,@@(map abs '(4 -5 6)) b) + ==> (a 3 4 5 6 b) +`((@samp{foo} ,(- 10 3)) ,@@(cdr '(c)) . ,(car '(cons))) + ==> ((foo 7) . cons) +`#(10 5 ,(sqrt 4) ,@@(map sqrt '(16 9)) 8) + ==> #(10 5 2 4 3 8) +} +@end format + + +Quasiquote forms may be nested. Substitutions are made only for +unquoted components appearing at the same nesting level +as the outermost backquote. The nesting level increases by one inside +each successive quasiquotation, and decreases by one inside each +unquotation. + + +@format +@t{`(a `(b ,(+ 1 2) ,(foo ,(+ 1 3) d) e) f) + ==> (a `(b ,(+ 1 2) ,(foo 4 d) e) f) +(let ((name1 'x) + (name2 'y)) + `(a `(b ,,name1 ,',name2 d) e)) + ==> (a `(b ,x ,'y d) e) +} +@end format + + +The two notations + @t{`}@r{} and @t{(quasiquote @r{})} + are identical in all respects. + @samp{,@r{}} is identical to @samp{(unquote @r{})}, + and + @samp{,@@@r{}} is identical to @samp{(unquote-splicing @r{})}. +The external syntax generated by @code{write} for two-element lists whose +@vindex @w{write} +car is one of these symbols may vary between implementations. + +@cindex @w{`} + + +@format +@t{(quasiquote (list (unquote (+ 1 2)) 4)) + ==> (list 3 4) +'(quasiquote (list (unquote (+ 1 2)) 4)) + ==> `(list ,(+ 1 2) 4) + @emph{}i.e., (quasiquote (list (unquote (+ 1 2)) 4)) +} +@end format + + +Unpredictable behavior can result if any of the symbols +@code{quasiquote}, @code{unquote}, or @code{unquote-splicing} appear in +@vindex @w{unquote-splicing} +@vindex @w{unquote} +@vindex @w{quasiquote} +positions within a @r{} otherwise than as described above. + +@end deffn + +@node Macros, , Derived expression types, Expressions +@section Macros + +@menu +* Binding constructs for syntactic keywords:: +* Pattern language:: +@end menu + + + +Scheme programs can define and use new derived expression types, + called @emph{macros}. +@cindex @w{macro} +Program-defined expression types have the syntax + +@example + +(@r{} @r{} ...) + +@end example + +where @r{} is an identifier that uniquely determines the +expression type. This identifier is called the @emph{syntactic +keyword}, or simply @emph{keyword}, of the macro. The +@cindex @w{macro keyword} +@cindex @w{keyword} +@cindex @w{syntactic keyword} +number of the @r{}s, and their syntax, depends on the +expression type. + +Each instance of a macro is called a @emph{use} +@cindex @w{macro use} +of the macro. +The set of rules that specifies +how a use of a macro is transcribed into a more primitive expression +is called the @emph{transformer} +@cindex @w{macro transformer} +of the macro. + +The macro definition facility consists of two parts: + + + +@itemize @bullet + +@item +A set of expressions used to establish that certain identifiers +are macro keywords, associate them with macro transformers, and control +the scope within which a macro is defined, and + +@item +a pattern language for specifying macro transformers. + +@end itemize + + +The syntactic keyword of a macro may shadow variable bindings, and local +variable bindings may shadow keyword bindings. All macros +@cindex @w{keyword} +defined using the pattern language are ``hygienic'' and ``referentially +transparent'' and thus preserve Scheme's lexical scoping [Kohlbecker86], [ +hygienic], [Bawden88], [macrosthatwork], [syntacticabstraction]: + +@cindex @w{hygienic} + +@cindex @w{referentially transparent} + + + + +@itemize @bullet + + +@item +If a macro transformer inserts a binding for an identifier +(variable or keyword), the identifier will in effect be renamed +throughout its scope to avoid conflicts with other identifiers. +Note that a @code{define} at top level may or may not introduce a binding; +see section @ref{Definitions}. + +@item +If a macro transformer inserts a free reference to an +identifier, the reference refers to the binding that was visible +where the transformer was specified, regardless of any local +bindings that may surround the use of the macro. + + +@end itemize + +@vindex @w{define} + +@c The low-level facility permits non-hygienic macros to be written, +@c and may be used to implement the high-level pattern language. + +@c The fourth section describes some features that would make the +@c low-level macro facility easier to use directly. + +@node Binding constructs for syntactic keywords, Pattern language, Macros, Macros +@subsection Binding constructs for syntactic keywords + + + +@samp{Let-syntax} and @samp{letrec-syntax} are +analogous to @samp{let} and @samp{letrec}, but they bind +syntactic keywords to macro transformers instead of binding variables +to locations that contain values. Syntactic keywords may also be +bound at top level; see section @ref{Syntax definitions}. + + +@deffn {syntax} let-syntax @r{} @r{} + +@emph{Syntax:} +@r{} should have the form + +@format +@t{((@r{} @r{}) @dots{},) +} +@end format + +Each @r{} is an identifier, +each @r{} is an instance of @samp{syntax-rules}, and +@r{} should be a sequence of one or more expressions. It is an error +for a @r{} to appear more than once in the list of keywords +being bound. + +@emph{Semantics:} +The @r{} is expanded in the syntactic environment +obtained by extending the syntactic environment of the +@samp{let-syntax} expression with macros whose keywords are +the @r{}s, bound to the specified transformers. +Each binding of a @r{} has @r{} as its region. + + +@format +@t{(let-syntax ((when (syntax-rules () + ((when test stmt1 stmt2 ...) + (if test + (begin stmt1 + stmt2 ...)))))) + (let ((if #t)) + (when if (set! if 'now)) + if)) ==> now + +(let ((x 'outer)) + (let-syntax ((m (syntax-rules () ((m) x)))) + (let ((x 'inner)) + (m)))) ==> outer +} +@end format + + +@end deffn + + +@deffn {syntax} letrec-syntax @r{} @r{} + +@emph{Syntax:} +Same as for @samp{let-syntax}. + +@emph{Semantics:} + The @r{} is expanded in the syntactic environment obtained by +extending the syntactic environment of the @samp{letrec-syntax} +expression with macros whose keywords are the +@r{}s, bound to the specified transformers. +Each binding of a @r{} has the @r{} +as well as the @r{} within its region, +so the transformers can +transcribe expressions into uses of the macros +introduced by the @samp{letrec-syntax} expression. + + +@format +@t{(letrec-syntax + ((my-or (syntax-rules () + ((my-or) #f) + ((my-or e) e) + ((my-or e1 e2 ...) + (let ((temp e1)) + (if temp + temp + (my-or e2 ...))))))) + (let ((x #f) + (y 7) + (temp 8) + (let odd?) + (if even?)) + (my-or x + (let temp) + (if y) + y))) ==> 7 +} +@end format + + +@end deffn + +@node Pattern language, , Binding constructs for syntactic keywords, Macros +@subsection Pattern language + + + +A @r{} has the following form: + + +@deffn {} syntax-rules @r{} @r{} @dots{}, + +@emph{Syntax:} +@r{} is a list of identifiers and each @r{} +should be of the form + +@format +@t{(@r{} @r{